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=first
和http://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 入门使用