如何注释现有查询集

时间:2020-07-31 12:50:48

标签: django django-queryset

我想在基于类的视图中使用批注更新查询集。

为什么这样做:

def get_queryset(self):
   qs = self.model._default_manager.all().annotate(admin_roles_count=Count('administrators'))
   return qs

但这不是吗?

def get_queryset(self):
    qs = super().get_queryset()
    qs.annotate(admin_roles_count=Count('administrators'))
    return qs

print(qs[0].admin_roles_count)引发:

AttributeError: 'MyModel' object has no attribute 'admin_roles_count'

1 个答案:

答案 0 :(得分:3)

这是因为每次调用annotate(...)时都会创建并返回一个新的Queryset对象。因此,您需要将功能更新为

def get_queryset(self):
    qs = super().get_queryset()
    qs = qs.annotate(admin_roles_count=Count('administrators'))
   ^^^^^^^^
    return qs

这是由于 lazy loading of QuerySets