如何允许在所有字段上使用 djangorestframework 进行通用过滤?
How to allow generic filtering with djangorestframework on all fields?
我的包裹:
- djangorestframework==3.2.5
- django-filter==0.11.0
- djangorestframework-filters==0.5.0
我正在使用 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]
我的包裹:
- djangorestframework==3.2.5
- django-filter==0.11.0
- djangorestframework-filters==0.5.0
我正在使用 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]