我尝试在我的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()
(我在第一回合试图使用过滤后端来避免这种情况)。
有人有任何建议吗?
答案 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()
我希望有所帮助。