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 REST framework视图

django框架学习六:优化views.py文件,使用rest_framework中的APIVew和Response返回

Django REST Framework 中的外键值