Django REST Framework 中的否定或排除过滤器
Posted
技术标签:
【中文标题】Django REST Framework 中的否定或排除过滤器【英文标题】:Negation or exclude filter in Django REST Framework 【发布时间】:2014-06-06 03:41:10 【问题描述】:我使用 Django REST Framework 已经有一段时间了,但遇到了一种情况,我需要在 API 视图中检索除已知关系之外的所有内容。再次查看文档后,我看不到任何内置机制来实现这一点。我意识到我可以在 ListView 中覆盖 get_queryset()
并解析自定义 URL 查询参数,然后进行过滤,但我很好奇是否还有其他人有更优雅的解决方案?
更新
经过更多研究,这似乎更像是一个 django-filter 问题,我找不到任何排除功能的提及。我确实找到了这个:
https://bitbucket.org/mjs7231/django-rest-framework-filtering
它确实提供了结果中的排除值。
【问题讨论】:
你能修改接受的答案吗?我认为我的回答指出了解决此问题的更简单方法。 【参考方案1】:在您的过滤器集中的过滤器定义中使用exclude
参数。
class MyFilterSet(FilterSet):
negated_field__not = django_filters.NumberFilter(field_name='negated_field', exclude=True)
class Meta:
model = Model
fields = ['some_field', 'some_other_field']
class MyViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Model.objects.all()
serializer_class = SomeSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = MyFilterSet
相当于Model.objects.all().exclude(negated_field__exact=value)
。然后,您可以从您的前端排除请求这样的网址:/api/my_viewset/?negated_field__not=value
。
【讨论】:
谢谢它有效,但在我的情况下,我需要将NumberFilter
name
属性更改为field_name
【参考方案2】:
听起来您正在搜索custom filter backend
【讨论】:
谢谢,这比一次性的get_queryset
覆盖更可取。我没有看到任何其他方式。我想这更多是 django-filter 没有这个功能的问题。
如果过滤器复杂且多,覆盖 get_queryset 可能会很麻烦。这里的替代方式:***.com/questions/14258338/…【参考方案3】:
您可以使用django-rest-framework-filters。此包支持查询字符串 key!=value 中的排除语法。
例如,/api/search?name!=Alex
【讨论】:
这在理论上可以回答这个问题,但最好将答案的基本部分包含在此处以供将来的用户使用,并提供链接以供参考。链接主导的答案可能会失效以上是关于Django REST Framework 中的否定或排除过滤器的主要内容,如果未能解决你的问题,请参考以下文章
Django-Rest-Framework 中的序列化程序问题
如何从 django-rest-framework 中的文件列表中过滤图像
Django Rest Framework 中的 JWT 身份验证错误“无效签名”
django框架学习六:优化views.py文件,使用rest_framework中的APIVew和Response返回