大O表示法:在Django模板中使用多个forloop与在views.py中使用过滤器的多个查询

时间:2018-12-14 05:24:25

标签: python django django-templates django-views django-orm

这是一个特定的问题,基于尝试提高查询数据时的性能速度。

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

在我的示例中,我正在比较两种情况。


(1)在第一个中,我在 views.py 中有一个查询来获取所有项目。当然,Item是我模型中的架构。无论如何,在我要渲染的模板中,我传递了上下文,并且有11个单独的forloop都在同一个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 个答案:

答案 0 :(得分:2)

如果您有包含Itemcategory字段的name模型,则可以使用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结果,而无需所有这些单独的数据库查询。

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

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