我想使用 django 管理界面来显示模型中的数据聚合。例如:模型具有以下字段 [员工姓名、工资、月份] 我想要包含字段 [月份、total_salary_paid、cumulative_of_month_salaries_paid] 的聚合表。我该怎么做呢 ??我已经搜索过互联网,但没有找到任何方法。任何参考或指导都会有所帮助
问问题
2889 次
2 回答
11
这是我最近的一个项目的片段。它在管理员中添加一列“此 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))
于 2014-03-19T22:19:23.200 回答
0
如果我理解正确,你知道如何编写一个 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 管理员中显示为一个字段。
于 2014-03-19T22:32:34.647 回答