Интерфейс администратора Django для отображения агрегатов

Я хочу использовать интерфейс администратора django для отображения агрегатов данных в модели. Пример: в модели есть следующие поля [имя сотрудника, зарплата, месяц]. Я хочу составить таблицу с полями [месяц, итог_саль_плата, cumulative_of_month_salaries_paid]. Как мне это сделать?? Я искал в интернете, но не нашел способа сделать это... любая ссылка или руководство помогло бы

2 ответа

Решение

Вот фрагмент из моего недавнего проекта. Он добавляет столбец в админке для "есть ли какие-либо записи в этой 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))

Если я правильно понимаю, вы знаете, как написать функцию 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.

Другие вопросы по тегам