'Django rest framework, perform update doesn't work

I have a small messaging API where the message contains a mark read boolean field.

I'm trying to automatically update the message instance so if the user logged in after the message was created, it'll be marked as read.

   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, SearchFilter, OrderingFilter]
    filterset_fields = FILTERS.FILTER_SET
    search_fields = FILTERS.SEARCH_FIELDS
    ordering_fields = FILTERS.ORDERING_FIELDS
    ordering = [MessageFields.DATE, ]

    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):
        """
        Set the sender to the logged in user.
        """
        serializer.save(sender=self.get_user())

    def perform_update(self, serializer):
        """
        Update the message read field to true if necessary.
        """
        date = self.kwargs[MessageFields.DATE]
        mark_read = self.kwargs[MessageFields.MARK_READ]
        last_login = self.get_user().last_login
        # If the message hasn't been read yet.
        if not mark_read:
            if last_login > date:
                serializer.save(mark_read=True)
            pass
        pass

But this is not updating the object when I access it.



Solution 1:[1]

I've also come around this issue and what helped me was overriding the update method itself and getting the instance object from there...

For example in your case, add:

def update(self,request,*args,**kwargs):
    instance = self.get_object()
    instance.sender = self.get_user()
    serializer = self.get_serializer(instance,data = request.data)
    self.perform_update(serializer)
    return Response(serializer.data)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ken Mbira