在django-rest中不起作用的范围过滤器在过滤时根本没有反应



在django-rest中不工作的范围过滤器在过滤时根本没有反应

查看

class MDShopListView(generics.ListAPIView):
queryset = smartphone.objects.all()
filter_backends = (DjangoFilterBackend,)
filterset_class = ShoppFilter
def get(self,request):

queryset = self.get_queryset()
serializer=MDShopListSerializer(queryset,many=True)


return Response(serializer.data)


您需要使用self.filter_queryset(…)[drf-doc]过滤查询集:

class MDShopListView(generics.ListAPIView):
queryset = smartphone.objects.all()
filter_backends = (DjangoFilterBackend,)
filterset_class = ShoppFilter

def get(self, request):
queryset =self.filter_queryset(self.get_queryset())
serializer=MDShopListSerializer(queryset,many=True)
return Response(serializer.data)

但实际上覆盖get(…)而不是所必需的,因为现在它几乎与ListAPIView默认情况下所做的完全一样,只是不分页。事实上,ListAPIView被定义为[GitHub]:

class ListAPIView(mixins.ListModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)

并且.list(…)方法在ListModelMixin中被定义为[GitHub]:

def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)

因此,您可以将其定义为:

class MDShopListView(generics.ListAPIView):
queryset = smartphone.objects.all()
filter_backends = (DjangoFilterBackend,)
filterset_class = ShoppFilter
# specify the serializer ↓
serializer_class = MDShopListSerializer

最新更新