目标:我想基于模型方法结果在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查询表示。
它有效,但它真的很难看。还有更好的方法吗?