为什么 queryset 属性只在我的 cbv 中评估一次

Why queryset attribute is only evaluated once in my 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)

我这样做是因为我希望我的视图适用于两种模型(return 它们都在同一个对象列表、分页等中)。问题是 queryset 始终包含服务器重置后的值。如果我在管理员中更改任何内容,则 queryset 在我重新启动服务器之前不会更改。我想这是因为表达式只计算了一次?

通过覆盖 get_queryset 方法可以工作,但我想知道为什么它不能通过直接分配给 queryset 属性来工作。

这就是当您在 class 级别定义事物时发生的情况。当 class 本身被定义时,任何代码在第一次导入时都会被评估一次。

您通过对其调用 sorted 显式评估您的查询集,因此它不再是惰性的。

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