我的包裹:
我正在使用djangorestframework将我的模型公开为一个宁静的api。为了使我和前端开发人员的生活更轻松,我想允许任何模型字段上的任何过滤器查找。但据我所知,这两个软件包都不支持开箱即用的通用过滤。我可以使用AllLookupsFilter,但仍需要为每个模型创建一个filterset类并指定每个字段。
是否有允许过滤所有模型和所有字段的通用方法?
答案 0 :(得分:2)
我创建了一个小帮助函数,它基于modelviewset的queryset模型即时创建filterset。它为模型中的每个字段添加了一个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
答案 1 :(得分:0)
您只需将filter_backends
添加到所有所需的视图中即可。
from rest_framework.filters import SearchFilter
class SimpleClass(generics.ListCreateAPIView):
serializer_class = SimpleSerializer
filter_backends = [SearchFilter]