大 O 表示法:在 Django 模板中使用多个 forloops VS 在 vi​​ews.py 中使用过滤器的多个查询

Posted

技术标签:

【中文标题】大 O 表示法:在 Django 模板中使用多个 forloops VS 在 vi​​ews.py 中使用过滤器的多个查询【英文标题】:Big O Notation: Using multiple forloops within Django template VS multiple queries using a filter in views.py 【发布时间】:2019-05-15 09:10:00 【问题描述】:

这是一个基于在查询数据时尝试提高性能速度的具体问题。

所以我试图在 Django 模板本身中弄清楚如何在第一次尝试时打破条件。似乎不可能,建议都是使用 views.py 来代替逻辑。这导致我尝试根据满足的条件进行过滤。

在我的示例中,我有两个要比较的场景。


(1) 在第一个中,我的 views.py 中有一个查询来获取所有项目。当然,Item 是我的模型中的一个模式。无论如何,在我要渲染的模板中,我传递了上下文,并且有 11 个单独的 forloops 都在同一个 all_items 循环上进行迭代。然后根据条件(即item.category),渲染相应的html

同样,我想做的是有 1 个循环,然后根据条件渲染到适当的位置,但只执行一次 all_items 循环。不幸的是,在每次连续迭代中不过度渲染我不想要的 html 的条件之后,我无法打破模板中的循环。

所以这让我想到了下一个场景:


(2) 在我看来,我创建了 11 个单独的查询 (例如 item.objects.filter(category='1')、item.objects.filter(category='2' 等) >。我依次将这些变量中的每一个分配给通过我的视图作为上下文传递的 11 个单独变量,以在模板中呈现。这也允许我删除模板中检查类别的条件。


我想知道的是,在后一个示例中,每个查询过滤器是否与为模板中的 all_items 运行相同的 forloop 相同,只是做了一点不同?我是否节省了后者的时间?仅根据我的用户体验很难说,所以任何见解都会很棒。谢谢。

【问题讨论】:

【参考方案1】:

如果您有包含categoryname 字段的Item 模型,您可以使用values() 和带有filter() 的单个查询:

categories = ['1', '2', ... '11']

items = item.objects.filter(category__in=categories).values('category','name')

你的输出是:

<QuerySet ['category': '1', 'name': 'name1', 'category': 2, 'name': 'name2', ..., 'category': '11', 'name': 'name11']>

您可以循环 items 结果而不需要所有这些单独的数据库查询。

如有任何问题,请发表评论。

附:我以name 字段为例,它可以是模型中显示的任何字段。

【讨论】:

以上是关于大 O 表示法:在 Django 模板中使用多个 forloops VS 在 vi​​ews.py 中使用过滤器的多个查询的主要内容,如果未能解决你的问题,请参考以下文章

Django的模板系统

Django04-模板系统Template

Django框架模板详解

在 django 模板中的另一个大括号内使用大括号

Django-常用模板标签及过滤器

在 Django 模板中使用 for 循环显示多个 chart.js 图表