2015-05-29 58 views
1

我有以下查询集属性的CBV:为什么我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属性。

回答

2

这就是当你在课堂上定义事物时发生的情况。任何代码在第一次导入的时候都会被评估一次,当这个类本身被定义的时候。

你可以通过调用sorted来显式地评估你的查询集,所以它不再是懒惰的。

您是否知道get_queryset方法;这正是它的目的。

+0

啊,我明白了。 **懒惰**部分是这里的关键。谢谢! – argaen

+0

从技术上讲,这是因为'get_queryset()'调用了queryset.all(),它重新评估查询集,如果self.queryset不是'QuerySet'实例,则不会发生这种情况。分配一个普通的查询集,即使它被评估,也能正常工作。 – knbk