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