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

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)