Django-filter 在传递 filter_field 的特定值时获取所有记录

Posted

技术标签:

【中文标题】Django-filter 在传递 filter_field 的特定值时获取所有记录【英文标题】:Django-filter get all records when a specific value for a filter_field is passed 【发布时间】:2020-05-25 21:04:29 【问题描述】:

我正在使用 django-filter 根据 url 参数过滤我的 Queryset

class WorklistViewSet(ModelViewSet):


    serializer_class = MySerializer
    queryset = MyModel.objects.all()

    filter_backends = [DjangoFilterBackend, ]
    filterset_fields = ['class', ]
    # possible values of *class* which is allowed to be passed in the url params are ['first', 'second', 'ALL']. 

class MyModel(BaseModel):
       CLASS_CHOICES = (
        (FIRST_CLASS, 'first'),
        (SECOND_CLASS, 'second'),
    )
       class = models.CharField(choices=CLASS_CHOICES, max_length=3, )

网址http://127.0.0.1:8000?class=firsthttp://127.0.0.1:8000?class=first 给出了预期的结果。

我希望在调用http://127.0.0.1:8000?class=ALL 时,应该列出我表中的所有记录,即不过滤

在使用django-filter 时我该怎么做?

【问题讨论】:

【参考方案1】:

您可能想要使用 Filter.method,如 docs 中所述。

在你的情况下,我会这样做:

class F(django_filters.FilterSet):
    klass = CharFilter(method='my_custom_filter')

    class Meta:
        model = MyModel
        fields = ['klass']

    def my_custom_filter(self, queryset, name, value):
        if value == 'ALL':
            return queryset
        return queryset.filter(**
            name: value,
        )

还要注意class是Python中的保留字,不能用作变量名。我改用了klass,尽管它在许多 Python 书籍中用作其他内容,可能会造成混淆。

【讨论】:

以上是关于Django-filter 在传递 filter_field 的特定值时获取所有记录的主要内容,如果未能解决你的问题,请参考以下文章

django-filter:/goods/ __init__() 的 TypeError 得到了一个意外的关键字参数“名称”

python测试开发django-169.过滤器django-filter 入门使用

Python测试开发django-169.过滤器django-filter 入门使用

可以通过 django-filter URL 解析器执行“in”“lookup_type”吗?

django-filter使用分页

django-filter 使用分页