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

时间:2015-02-04 11:04:35

标签: python django django-models django-views django-queryset

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

但我也想要一些属于该对象的聚合。如果我说模型Person和模型Group且模型GroupPerson的外键,我可以覆盖get_object() { {1}}类似于:

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()外键的模型,那么如果我可以用我的代码示例中的聚合来实现这一点会更聪明。

1 个答案:

答案 0 :(得分:2)

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

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

请注意PersonView来电中的super()。您应该在此处使用班级视图的名称。

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

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