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

时间:2015-12-10 09:02:51

标签: django django-rest-framework django-filter django-filters

我的包裹:

  • djangorestframework == 3.2.5
  • django的滤波器== 0.11.0
  • djangorestframework滤波器== 0.5.0

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

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

2 个答案:

答案 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]