为什么 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
方法;这正是它的用途。
我有一个具有以下查询集属性的 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
方法;这正是它的用途。