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=first
和 http://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 书中被用作其他东西并且可能会造成混淆。
我正在使用 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=first
和 http://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 书中被用作其他东西并且可能会造成混淆。