如何在Django中动态过滤给定模型的管理列表视图?

时间:2013-08-17 23:48:15

标签: django filter django-admin

目标:我想基于模型方法结果在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查询表示。

它有效,但它真的很难看。还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

添加一个字段以在pre_save signal中缓存average_severity()的结果并在查询集中使用它,或者回退到raw sql