How to make an app that Django Rest Framework Filter and Django-Filter with ModelViewSet

21 Views Asked by At

When I use generics ListAPIView filter and order departs are working but if I use ModelViewSet it is not working. I added my code examples. How can I fix this problem? Thanks in advance

class MovieViewSet(generics.ListAPIView):
    queryset = Movie.objects.all().order_by('movie_id')
    serializer_class = serializers.MovieDetailSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    authentication_classes = [authentication.BasicAuthentication]

    # FILTER AND ORDER:
    filter_backends = [django_filters.DjangoFilterBackend, filters.OrderingFilter, filters.SearchFilter]
    filterset_fields = ['category', 'director', 'country']
    search_fields = ['category__name', 'director__name', 'name']
    ordering_fields = ['production_year', 'imdb', 'duration']

It is working!

class MovieViewSet(viewsets.ModelViewSet):
    queryset = Movie.objects.all().order_by('movie_id')
    serializer_class = serializers.MovieDetailSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    authentication_classes = [authentication.BasicAuthentication]

    # FILTER AND ORDER:
    filter_backends = [django_filters.DjangoFilterBackend, filters.OrderingFilter, filters.SearchFilter]
    filterset_fields = ['category', 'director', 'country']
    search_fields = ['category__name', 'director__name', 'name']
    ordering_fields = ['production_year', 'imdb', 'duration']

    def list(self, request, **kwargs):
        queryset = Movie.objects.all().order_by('name')
        serializer = MovieSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk):
        queryset = Movie.objects.all()
        movie = get_object_or_404(queryset, pk=pk)
        serializer = serializers.MovieDetailSerializer(movie)
        return Response(serializer.data)

    def has_permission(self, request, **kwargs):
        if request.METHOD in permissions.SAFE_METHODS:
            return True
        else:
            return request.user.is_staff()

It is not working!!

0

There are 0 best solutions below