带有 Django 过滤器的自定义过滤器

时间:2021-07-30 14:38:45

标签: python django django-rest-framework django-filters

我正在尝试使用 django_filters 编写自己的自定义过滤器类,如下所示:

from django_filters import rest_framework as filters


class FooFilter(filters.FilterSet):
    class Meta:
        model = Model 
        fields = ['custom_field',]


class Foo():
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = FooFilter

在模型中,由于我没有字段 custom_field,它会给出错误:TypeError: 'Meta.fields' must not contain non-model field names: custom_field

问题:是否可以使用 Django 过滤器集定义我自己的非模型字段名称的自定义查询?

1 个答案:

答案 0 :(得分:1)

您可以定义一个任意函数来进一步过滤查询集。例如:

class MyFilterSet(FilterSet):
    custom_field = CharFilter(method='filter_not_empty')

    def filter_custom_field(queryset, name, value):
        return queryset.filter(… some filtering …)

    class Meta:
        model = Model
        fields = ['custom_field']

因此,我们为 CharFilter 定义了一个 custom_field,从而解析字符串。使用`method='filter_not_empty',我们指的是将被调用的方法。

此方法使用需要过滤的 queryset 调用,name 是过滤器字段的名称(这里是 custom_field,但您可以,如果需要,对多个过滤器集字段使用相同的方法)和值。

该方法应返回一个用 QuerySet 过滤的 … some filtering …