1

目標: モデル メソッドの結果に基づいて、Django admin でカスタム フィルタリングを実現したいと考えています。

SimpleListFilters が queryset メソッドをオーバーライドする必要があるという事実を認識しています。私は厄介なハックをしてしまいました:


class AverageSeverityAboveListFilter(admin.SimpleListFilter):
    title = 'Severity above'
    parameter_name = 'severity_above'

    def lookups(self, request, model_admin):
        severities = ProblemSeverity.objects.all()
        options = []

        for severity in severities:
            options.append((severity.level, severity.name))

        return options

    def queryset(self, request, queryset):
        pks = [problemset.pk for problemset in queryset
               if problemset.average_severity() < float(self.value())]

        for pk in pks:
            queryset = queryset.exclude(pk=pk)

        return queryset

結果をキャッシュするためにモデルに新しいフィールドを導入したくありません。モデル エントリを比較するために使用されるこのランクは、テーブルに既に存在する値から計算でき、データの冗長性は好みません。

一般的なケース、つまり average_severity() が十分に複雑であるため、生の SQL クエリでは表現できないと仮定します。

それは機能しますが、それは本当に醜いです。より良い方法はありますか?

4

1 に答える 1

0

pre_save シグナルの結果をキャッシュするフィールドを追加average_severity()してクエリセットで使用するか、生の sqlにフォールバックします。

于 2013-08-18T04:34:31.750 に答える