显示聚合的 Django 管理界面

Posted

技术标签:

【中文标题】显示聚合的 Django 管理界面【英文标题】:Django admin interface to display aggregates 【发布时间】:2014-04-26 09:56:43 【问题描述】:

我想使用 django 管理界面来显示模型中的数据聚合。例如:模型具有以下字段 [员工姓名、工资、月份] 我想要包含字段 [月份、total_salary_paid、cumulative_of_month_salaries_paid] 的汇总表。我该怎么做呢 ??我已经搜索了互联网,但没有找到任何方法。任何参考或指导都会有所帮助

【问题讨论】:

条件聚合呢? 【参考方案1】:

如果我理解正确,您知道如何编写 Python 函数来查询数据库和计算聚合,只是不知道将该函数放在何处才能让结果显示在 Django 管理中。

这实际上是在ModelAdmin.list_display 的文档中(以“如果给定的字符串是模型的方法...”开头的段落)。

这是他们的例子:

from django.db import models
from django.contrib import admin
from django.utils.html import format_html

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    color_code = models.CharField(max_length=6)

    def colored_name(self):
        return format_html('<span style="color: #0;">1 2</span>',
                           self.color_code,
                           self.first_name,
                           self.last_name)

    colored_name.allow_tags = True

class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'colored_name')

在您的情况下,只需更改您的等效 colored_name() 来计算聚合,它应该在 Django 管理员中显示为一个字段。

【讨论】:

【参考方案2】:

这是我最近的一个项目中的一个 sn-p。它在管理员中添加一列“此 M2M 相关表中是否有任何条目?”另一个是“这个 M2M 相关表中的条目数是多少?”。你可以用 Django 提供的其他聚合函数做类似的事情。

from django.db.models import Count
from django.contrib import admin

class ExpertModelAdmin(admin.ModelAdmin):
    def num_companies(self, obj):
        """# of companies an expert has."""

        return obj.num_companies
    num_companies.short_description = "# companies"

    def has_video(self, obj):
        """Does the expert have a video?"""

        return bool(obj.has_video)
    has_video.short_description = "video?"
    has_video.boolean = True

    def get_queryset(self, request):
        """Use this so we can annotate with additional info."""

        qs = super(ExpertModelAdmin, self).get_queryset(request)
        return qs.annotate(num_companies=Count('company', distinct=True),
                           has_video=Count('mediaversion', distinct=True))

【讨论】:

以上是关于显示聚合的 Django 管理界面的主要内容,如果未能解决你的问题,请参考以下文章

Django Query 每天将两行中的值聚合为单个结果

Django聚合,计数总和

Django admin:从反向 FK 聚合中排序 list_display 字段

django聚合多天

Django聚合:仅求和返回值?

django功能六