django-rest-framework - DRF 3.7 autogen 文档中的条件过滤器集:我可以为路由添加查询参数过滤器(但仅适用于某些 HTTP 动词)
问题描述
(DRF v3.7,django-filters v1.1.0)
你好!我有一个有效的 FilterSet 可以让我通过查询参数过滤我的结果,例如http://localhost:9000/mymodel?name=FooOnly
这工作得很好。
class MyNameFilter(FilterSet):
name = CharFilter(field_name='name', help_text='Filter by name')
class Meta:
model = MyModel
fields = ('name',)
class MyModel(...):
...
filter_backends = (DjangoFilterBackend,)
filter_class = MyNameFilter
但是当我为我的 API 呈现内置的自动生成的文档时,我看到这个查询参数记录在我的路由中的所有方法中,例如GET
, PUT
,PATCH
等。
我只打算通过此查询参数过滤其中一些 HTTP 动词,因为它对其他人没有意义,例如PUT
有没有一种以这种方式使我的 FilterSet 有条件的好方法?以路由方法为条件。
我尝试在路由器级别应用此逻辑(一个错误的想法)。同样在 ViewSet 级别 - 但没有get_filter_class
与例如相同的覆盖方法get_serializer_class
。
谢谢您的帮助。
解决方案
你会进去get_filter_class
的DjangoFilterBackend
。您需要创建一个FilterBackend
覆盖该方法的新filter_queryset
方法。
class GETFilterBackend(DjangoFilterBackend):
def filter_queryset(self, request, queryset, view):
if request.method == 'GET':
return super().filter_queryset(request, queryset, view)
return queryset
class MyModel(...):
...
filter_backends = (GETFilterBackend,)
filter_class = MyNameFilter
推荐阅读
- discord.js - discord.js 类似门票的机器人错误 - 'TypeError: fn.bind is not a function'
- java - 在groovy(java)中如何自动找出json字段类型并从json返回值,用空格替换null?
- c# - UseSqlServer 中的连接字符串
- javascript - 分页和表单验证
- r - 将“y 确认”确认对话框添加到 R 函数?
- uml - 如何更改 ZenUML 序列图中默认的“用户”参与者标签
- video - youtube-dl 播放列表不再起作用
- pdf - 签署pdf时“定义签名数据范围的意外字节范围值”
- c - 定义宏中的尾随逗号
- gnuplot - Gnuplot:如何更改 y 轴,以免数据跳跃过大