Django REST Framework过滤后端

时间:2016-02-17 15:01:45

标签: django django-rest-framework

我尝试在我的GenericAPIView上实现一些基本过滤,如下所示:

  • 视图:

    class OperatorList(generics.GenericAPIView):
    
        permission_classes = (permissions.IsAuthenticated, IsAdmin)
    
        filter_class = OperatorsFilter
        serializer_class = OperatorSerializer
    
        def get_queryset(self):
            queryset = self.request.user.operators.all()
    
        def get(self, request, *args, **kwargs):
            serializer = OperatorSerializer(instance=self.get_queryset(),
                                        many=True,
                                        context=self.get_serializer_context())
            return Response(serializer.data)
    
  • 串行器:

    class OperatorSerializer(serializers.ModelSerializer):
        class Meta:
            model = Operator
            fields = ['id', 'name', 'created', ]
    
  • 过滤器集:

    import rest_framework_filters
    from rest_framework import filters
    from .models import Operator
    
    
    class OperatorFilter(filters.FilterSet):
    
        created = rest_framework_filters.DateTimeField(lookup_type='gte')
    
        class Meta:
            model = Operator
            fields = ('name', 'created', )
    

问题是过滤器以可浏览的API显示,但是“已创建”#39;不是DateTimeWidget,而是简单的输入。 此外,应用过滤器不起作用,我仍然需要在request.query_params中捕获get_queryset()(我在第一回合试图使用过滤后端来避免这种情况)。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:0)

这里的问题是你已经子类GenericAPIView,然后没有(重新)实现Django REST Framework在其具体视图类中提供的任何方便逻辑

相反,您希望子类化ListAPIView,它提供了一个实现您正在寻找的过滤行为的get方法。

magic 全部驻留在ListModelMixin,可根据需要过滤查询集...

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        ... method continues ...

您的最终视图类应该如下所示:

class OperatorList(generics.ListAPIView):

    permission_classes = (permissions.IsAuthenticated, IsAdmin)

    filter_class = OperatorsFilter
    serializer_class = OperatorSerializer

    def get_queryset(self):
        queryset = self.request.user.operators.all()

我希望有所帮助。