目标:我想在 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 查询来表达。
它有效,但它真的很难看。有没有更好的办法?