如何允许在所有字段上使用 djangorestframework 进行通用过滤?

How to allow generic filtering with djangorestframework on all fields?

我的包裹:

我正在使用 djangorestframework 将我的模型公开为 restful api。为了让我和前端开发人员的生活更轻松,我想允许在任何模型字段上进行任何过滤器查找。但据我所知,这两个包都不支持这种开箱即用的通用过滤。我可以使用 AllLookupsFilter,但仍需要为每个模型创建一个过滤器集 class 并指定每个字段。

是否有通用方法允许对所有模型和所有字段进行过滤?

我创建了一个小辅助函数,它基于模型视图集的查询集模型即时创建过滤器集。它为模型中的每个字段添加一个 AllLookupFilter。

from rest_framework import viewsets
import rest_framework_filters as filters


def create_universal_filter(klass):
    """Creates filterset class with all lookups  for all fields of given class"""
    field_filters = dict((f, filters.ALL_LOOKUPS) 
                    for f in klass._meta.get_all_field_names())

    class MyFilter(filters.FilterSet):
        class Meta:
            model = klass
            fields = field_filters
    return MyFilter


class GenericFilterModelViewSet(viewsets.ModelViewSet):
    """Allows all lookups on all fields"""
    def __init__(self, *args, **kwargs):
        self.filter_class = create_universal_filter(self.queryset.model)

然后我让我想要允许通用过滤的模型视图集继承它:

class DerivateGroupViewSet(GenericFilterModelViewSet):
    queryset = models.DerivateGroup.objects.all()
    serializer_class = serializers.DerivateGroupSerializer

您只需将 filter_backends 添加到所有需要的视图即可。

from rest_framework.filters import SearchFilter

class SimpleClass(generics.ListCreateAPIView):
    serializer_class = SimpleSerializer
    filter_backends = [SearchFilter]