这是一个特定的问题,基于尝试提高查询数据时的性能速度。
所以我试图在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相同,只是做了一些不同?我要与后者节省时间吗?仅基于我的用户体验很难说,因此任何见解都将是很棒的。谢谢。
答案 0 :(得分:2)
如果您有包含Item
和category
字段的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
字段为例,它可以是模型中显示的任何字段。