为什么queryset属性仅在我的cbv中计算一次

时间:2015-05-29 07:51:41

标签: django django-class-based-views

我有一个带有以下queryset属性的cbv:

queryset = sorted(                                                                                                                                                                                           
         chain(models.Event.objects.filter(is_published=True), models.Seminar.objects.filter(is_published=True)),
         key=attrgetter('start_date'), reverse=True)

我这样做是因为我希望我的视图能够与两个模型一起工作(在同一个对象列表中返回所有模型,分页等)。问题是queryset始终包含服务器重置后的值。如果我在管理员中更改了任何内容,则在重新启动服务器之前不会更改queryset。我想这是因为表达式只被评估一次?

通过覆盖get_queryset方法有效,但我想通过直接将其分配给queryset属性来了解它无效的原因。

1 个答案:

答案 0 :(得分:2)

当您在班级定义事物时会发生这种情况。当定义类本身时,任何代码都会在第一次导入时评估一次。

您通过在其上调用sorted来明确评估您的查询集,因此它不再是懒惰的。

您了解get_queryset方法;这正是它的用途。