hak*_*aki 11 django django-rest-framework
我有很多资源,我想将DjangoFilterBackend应用于所有这些资源.
尝试过设置 settings.py
'DEFAULT_FILTER_BACKENDS': [
'rest_framework.filters.DjangoFilterBackend',
]
Run Code Online (Sandbox Code Playgroud)
但它没有用
我尝试只添加filter_backends = (filters.DjangoFilterBackend,)到我的一个资源,它仍然无法正常工作.
只有在我明确添加之后filter_fields = ('col1','col2',)才开始使用这些字段.
有没有什么办法可以将过滤后端应用到所有资源和所有字段(例如我使用权限的方式......)?
谢谢.
Kev*_*own 11
现在你要告诉Django REST Framework使用DjangoFilterBackendfor all视图,但是你没有告诉它FilterSet应该如何生成.
django-filterFilterSet如果fields设置为,None将自动为模型上的所有字段生成a .Django REST Framework将自动生成一个FilterSetif filter_fields未设置为None,这意味着您将无法使用默认值DjangoFilterBackend.
您可以创建自定义DjangoFilterBackend,它将自动生成FilterSet模型上的所有字段.
from rest_framework.filters import DjangoFilterBackend
class AllDjangoFilterBackend(DjangoFilterBackend):
"""
A filter backend that uses django-filter.
"""
def get_filter_class(self, view, queryset=None):
"""
Return the django-filters `FilterSet` used to filter the queryset.
"""
filter_class = getattr(view, 'filter_class', None)
filter_fields = getattr(view, 'filter_fields', None)
if filter_class or filter_fields:
return super(AllDjangoFilterBackend, self).get_filter_class(self, view, queryset)
class AutoFilterSet(self.default_filter_set):
class Meta:
model = queryset.model
fields = None
return AutoFilterSet
Run Code Online (Sandbox Code Playgroud)
对于视图定义自定义filter_class或的情况,这仍将使用原始过滤器后端filter_fields,但它将FilterSet为所有其他情况生成自定义.请记住,您不应该允许过滤未通过API返回的字段,因为您要面对未来的安全问题(例如人们通过密码过滤用户列表).
小智 6
好吧,我知道那是很久以前的事了,但我今天(2019/11)才遇到这个问题,所以我决定以这种方式分享,我认为这样更好一点:
仅用于'__all__'过滤字段
filter_fields = '__all__'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4751 次 |
| 最近记录: |