Search code examples
pythondjangodjango-rest-frameworkdjango-viewsdrf-queryset

filter_queryset with boolean field


I have the following view:

class MessagesViewSet(ModelViewSet):
    """
    A simple ViewSet for viewing and editing the messages
    associated with the user.
    """
    authentication_classes = [TokenAuthentication, ]
    permission_classes = [IsAuthenticated]
    serializer_class = MessageSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = [MessageFields.MARK_READ]

    def get_user(self):
        user = self.request.user
        return user

    def get_queryset(self):
        return Message.objects.filter(sent_to=self.get_user())

    def perform_create(self, serializer):
        serializer.save(sender=self.get_user())

    @action(detail=True, )
    def unread_messages(self, request, pk):
        """
        Return all of the user's unread messages.
        """
        data = self.filter_queryset(self.get_queryset())
        serialized_data = MessageSerializer(data, many=True)
        return Response(serialized_data.data, status=HTTP_200_OK)

in unread_messages I want to return only the object that has mark_read = True (It's a boolean field). right now it returns all objects because there's no restriction in the method about being True or False.

So how can I set some sort of a flag in the method?


Solution

  • You filter it with mark_read is (likely) False:

    class MessagesViewSet(ModelViewSet):
        """
        A simple ViewSet for viewing and editing the messages
        associated with the user.
        """
        authentication_classes = [TokenAuthentication, ]
        permission_classes = [IsAuthenticated]
        serializer_class = MessageSerializer
        filter_backends = [DjangoFilterBackend]
        filterset_fields = [MessageFields.MARK_READ]
    
        def get_user(self):
            user = self.request.user
            return user
    
        def get_queryset(self):
            return Message.objects.filter(sent_to=self.get_user(), mark_read=False)
    
        def perform_create(self, serializer):
            serializer.save(sender=self.get_user())
    
        @action(detail=True, )
        def unread_messages(self, request, pk):
            """
            Return all of the user's unread messages.
            """
            data = self.filter_queryset(self.get_queryset())
            serialized_data = MessageSerializer(data, many=True)
            return Response(serialized_data.data, status=HTTP_200_OK)

    or you can filter these only in the unread_messages with:

    class MessagesViewSet(ModelViewSet):
        """
        A simple ViewSet for viewing and editing the messages
        associated with the user.
        """
        authentication_classes = [TokenAuthentication, ]
        permission_classes = [IsAuthenticated]
        serializer_class = MessageSerializer
        filter_backends = [DjangoFilterBackend]
        filterset_fields = [MessageFields.MARK_READ]
    
        def get_user(self):
            user = self.request.user
            return user
    
        def get_queryset(self):
            return Message.objects.filter(sent_to=self.get_user())
    
        def perform_create(self, serializer):
            serializer.save(sender=self.get_user())
    
        @action(detail=True, )
        def unread_messages(self, request, pk):
            """
            Return all of the user's unread messages.
            """
            data = self.filter_queryset(self.get_queryset()).filter(mark_read=False)
            serialized_data = MessageSerializer(data, many=True)
            return Response(serialized_data.data, status=HTTP_200_OK)