Django管理页面,如何展示关联模型的聚合值

14

在单个Django管理模型中,是否可以聚合相关对象的字段?

例如,我有一个“学生”对象,它具有指向“测试”对象的外键。 “测试”对象具有一个“得分”字段。

我能否对所有学生的测试得分进行聚合,并将其放置在管理显示列表属性中?

1个回答

26

例如,您可以:

class FixtureAdmin(admin.ModelAdmin): 
    list_display = ["id", "title", "date", "num_fixture_metas_count"]

    def get_queryset(self, request):
        qs = super(FixtureAdmin, self).get_queryset(request)
        return qs.annotate(num_fixture_metas=Count('fixturemeta'))

    def num_fixture_metas_count(self, obj):
      return obj.num_fixture_metas
    num_fixture_metas_count.short_description = 'Fixture Count'
    num_fixture_metas_count.admin_order_field = 'num_fixture_metas'

然而,据我所知,使用这种方法无法通过单击管理界面上的这些字段进行排序,因为将.annotate()中的num_fixture_metas添加到list_display中会导致缺少字段错误。

https://docs.djangoproject.com/zh-hans/3.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display https://docs.djangoproject.com/zh-hans/3.2/topics/db/aggregation/


刚刚添加了在同一字段上排序的选项。 - Bryan
好的,谢谢。但是我该如何将“num_fixtures_metas_count”添加到字段而不是列表显示中呢? - thnee
@thnee 以防有人来寻找答案,将num_fixtures_metas_count添加到字段中,您需要将其放入只读列表中。 - elsadek
1
你必须重写 get_queryset() 而不是 queryset()。https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset - ivy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接