5

django 管理インターフェイスを使用して、モデル内のデータの集計を表示したいと考えています。例: モデルには次のフィールド [従業員名、給与、月] があります。フィールド [月、総給与支払額、累積月間給与支払額] を持つ集計テーブルが必要です。どうすればいいですか?? 私はインターネットを検索しましたが、それを行う方法が見つかりませんでした..参照やガイダンスが役立ちます

4

2 に答える 2

11

これは私の最近のプロジェクトからの抜粋です。管理画面に「この M2M 関連テーブルにエントリはありますか?」という列が追加されます。もう 1 つは「この 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 admin のフィールドとして表示されるはずです。

于 2014-03-19T22:32:34.647 に答える