目標: モデル メソッドの結果に基づいて、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 クエリでは表現できないと仮定します。
それは機能しますが、それは本当に醜いです。より良い方法はありますか?