我在Django中有一个DetailView
。在我的模板中,我在对象字典中打印字段,例如object.full_name
。
但我也想要一些属于该对象的聚合。如果我说模型Person
和模型Group
且模型Group
有Person
的外键,我可以覆盖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()
外键的模型,那么如果我可以用我的代码示例中的聚合来实现这一点会更聪明。
答案 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']