Python 在Django的DetailView中使用get_object()和aggregate()

Python 在Django的DetailView中使用get_object()和aggregate(),python,django,django-models,django-views,django-queryset,Python,Django,Django Models,Django Views,Django Queryset,我在Django中有一个DetailView。在我的模板中,我正在打印对象字典中的字段,例如object.full\u name 但是我还想要一些属于对象的聚合。如果说我有一个modelPerson和一个modelGroup并且modelGroup有一个指向Person的外键,那么我可以在我的DetailView中覆盖get\u object(),类似于: def get_object(self): return super(DetailView, self).get_object().

我在Django中有一个
DetailView
。在我的模板中,我正在打印对象字典中的字段,例如
object.full\u name

但是我还想要一些属于对象的聚合。如果说我有一个model
Person
和一个model
Group
并且model
Group
有一个指向
Person
的外键,那么我可以在我的
DetailView
中覆盖
get\u object()
,类似于:

def get_object(self):
    return super(DetailView, self).get_object().aggregate(num_groups=Count('group_set'))
我已经验证了我的建议,但不起作用。我想一定有一些解决方法可以做到这一点,而不必重写
get\u context\u data()
并将变量填充为
context['num\u groups']=Group.objects.filter(person=self.object).count()
。这是可以做到的,但是如果我有多个模型,并且有一个外键指向
Person
,那么如果我可以像我的代码示例那样使用聚合来实现这一点,那就更明智了。

返回的是模型实例实例,而不是查询集。但您可以填充对象的任何属性:

def get_object(self):
    object = super(PersonView, self).get_object()
    object.num_groups = object.group_set.all().count()
    return object
注意
super()
调用中的
PersonView
。您应该在此处使用类视图的名称

如果您想获得与个人相关的多个计数,则可以使用以下方法:

counts = Person.objects.filter(pk=object.pk).aggregate(
                  num_groups=Count('group_set'), num_items=Count('item_set'))
object.num_groups = counts['num_groups']
object.num_items = counts['num_items']

谢谢:-)我可以用一个类似于你的嵌套关系的符号吗?我的意思是我可以写
聚合(num\u items=Count('group\u set\u item\u set')
,但我也可以写
self.person.group\u set.item\u set.Count()
\u set
是返回查询集的实例的属性。这意味着您不能链接诸如
组\u set.item\u set
之类的属性。我的示例将生成2个查询。您可以通过重新实现
SingleObjectMixin.get\u object()的逻辑将其缩减为1个查询
model。但我建议您不要这样做。这两个查询非常便宜。但我想计算与此人相关的多个计数。如果只是这两个查询,我不会担心。您可以在第二个查询中聚合任意数量的计数。请参阅更新的答案。