gpt4 book ai didi

django - 如何将过滤器后端应用于 Django Rest Framework 中所有资源的所有字段?

转载 作者:行者123 更新时间:2023-12-04 02:04:58 24 4
gpt4 key购买 nike

我有很多资源,我想将 DjangoFilterBackend 应用于所有资源。

settings.py 中尝试设置

'DEFAULT_FILTER_BACKENDS': [
'rest_framework.filters.DjangoFilterBackend',
]

但它没有用

我尝试只添加 filter_backends = (filters.DjangoFilterBackend,)到我的资源之一,它仍然没有用。

只有在我明确添加 filter_fields = ('col1','col2',) 之后它开始只处理这些领域。

有什么方法可以将过滤器后端应用于所有资源和所有字段(与我对权限的处理方式相同...)?

谢谢。

最佳答案

现在你告诉 Django REST Framework 使用 DjangoFilterBackend对于所有 View ,但您没有告诉它 FilterSet应该生成。
django-filter会自动生成 FilterSet对于模型上的所有字段,如果 fields are set to None . Django REST Framework 会自动生成一个 FilterSet如果 filter_fields are not set to 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

对于 View 定义自定义 filter_class 的情况,这仍将使用原始过滤器后端。或 filter_fields ,但它会生成一个自定义 FilterSet对于所有其他情况。请记住,您不应允许过滤未通过 API 返回的字段,因为您将面临 future 的安全问题(例如人们通过密码过滤用户列表)。

关于django - 如何将过滤器后端应用于 Django Rest Framework 中所有资源的所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com