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

Use get_object() and aggregate() in DetailView in Django

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

但我还想要一些属于该对象的聚合。如果说我有一个模型 Person 和一个模型 Group 并且模型 Group 有一个指向 Person 的外键,那么我可以在我的 DetailView 是这样的:

def get_object(self):
    return super(DetailView, self).get_object().aggregate(num_groups=Count('group_set'))

我已经测试了我的建议,但它不起作用。我想一定有一些解决方法可以做到这一点,而不必覆盖 get_context_data() 并将变量填充为 context['num_groups'] = Group.objects.filter(person=self.object).count()。这是可以做到的,但是如果我有多个模型带有 Person 的外键,那么如果我可以像我的代码示例中那样使用聚合来完成它会更聪明。

DetailView.get_object() returns 模型实例实例不是查询集。但是您可以填充对象的任何属性:

def get_object(self):
    object = super(PersonView, self).get_object()
    object.num_groups = object.group_set.all().count()
    return object

注意 super() 调用中的 PersonView。您应该在此处使用 class 视图的名称。

如果你想获得与人相关的多个计数,那么你可以这样做:

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']