【问题标题】:Custom filter with Django Filters使用 Django 过滤器的自定义过滤器
【发布时间】:2021-07-30 14:38:45
【问题描述】:

我正在尝试使用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 Filterset 定义我自己的非模型字段名称的自定义查询?

【问题讨论】:

  • 您的Model 中的custom_field 是什么?
  • 只是一个随意的名字。我想在发出请求时将此“自定义名称”用作查询参数,但此名称不是模型中的字段。
  • 好吧,如果它不是模型中的字段,那么使用它是没有意义的。如果你想制作一个额外的过滤字段,你需要先定义这样的字段并实现一个过滤查询集的方法。
  • 也许你应该看看method 参数django filter doc 并在class meta 上方添加custom_field
  • 谢谢,有道理。但是我可以定义这个并使用 FooFilter 类中的自定义查询集实现这个方法吗? @WillemVanOnsem

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


【解决方案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']

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

这个方法是用需要过滤的queryset调用的,name是过滤字段的名字(这里是custom_field,但是你可以,如果你愿意,对多个过滤器集字段)和值。

该方法应该返回一个QuerySet,它被… some filtering …过滤掉

【讨论】:

  • 如何在 queryset.filter 中添加或条件?我发现,例如,这不起作用:queryset.filter(name__icontains=value, sku__iexact=value) 也不是:queryset.filter(Product(name__icontains)=value | Product(sku__iexact=value))
  • @MicheleCandura:请提出一个新问题并包含相关模型。
  • 好的,谢谢你的建议,这是新问题:stackoverflow.com/q/71798874/13712068
猜你喜欢
  • 2016-07-01
  • 2017-08-17
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 2018-01-15
  • 1970-01-01
相关资源
最近更新 更多