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

Django-filter get all records when a specific value for a filter_field is passed

我正在使用 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, )

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

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

我如何在使用 django-filter 时执行此操作?

您可能想要使用 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 书中被用作其他东西并且可能会造成混淆。