【问题标题】:Negation or exclude filter in Django REST FrameworkDjango 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

它确实提供了结果中的排除值。

【问题讨论】:

  • 你能修改接受的答案吗?我认为我的回答指出了解决此问题的更简单方法。

标签: python django django-rest-framework django-filter


【解决方案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 可能会很麻烦。这里的替代方式:stackoverflow.com/questions/14258338/…
【解决方案3】:

您可以使用django-rest-framework-filters。此包支持查询字符串 key!=value 中的排除语法。

例如,/api/search?name!=Alex

【讨论】:

  • 这在理论上可以回答这个问题,但最好将答案的基本部分包含在此处以供将来的用户使用,并提供链接以供参考。链接主导的答案可能会失效
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 2013-05-21
  • 2017-01-23
  • 2019-04-21
  • 2019-02-12
  • 2013-02-13
  • 2018-02-02
  • 2020-07-08
相关资源
最近更新 更多