Issue
I have to override default list()
method of a DRF ViewSet but, when I do so, all filtering, ordering and pagination stop working.
This is the code of the ViewSet:
class ZoneViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = models.Zone.objects.all()
serializer_class = serializers.ZoneSerializer
filter_backends = (SearchFilter, OrderingFilter,)
search_fields = ('city', 'name')
def list(self, serializer, pk=None):
if pk:
queryset = models.Zone.objects.filter(city=pk)
else:
queryset = models.Zone.objects.all()
serializer = serializers.ZoneSerializer(queryset, many=True, context={'request':self.request})
return Response(serializer.data)
How can I override list()
method without losing this functionality?
Solution
Default list()
method implements all these features. So instead of overriding list
try override get_queryset()
method. You can use self.kwargs['pk']
to get pk
value:
class ZoneViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticated,)
queryset = models.Zone.objects.all()
serializer_class = serializers.ZoneSerializer
filter_backends = (SearchFilter, OrderingFilter,)
search_fields = ('city', 'name')
def get_queryset(self):
pk = self.kwargs['pk']
if pk:
queryset = models.Zone.objects.filter(city=pk)
else:
queryset = models.Zone.objects.all()
Answered By - neverwalkaloner
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.