Ghazi
Ghazi

Reputation: 806

Django Rest Framework fail on setting a new context to the serializer

Django time:

I am facing an issue with providing a context to the serializer:

class CommentSerializer(serializers.ModelSerializer):
    likes = CustomUserSerializer(many=True,source='likes.all')



    
    class Meta:
        fields = 'likes',
        model = models.Comment
    
    def get_user_like(self,obj):
        for i in obj.likes.all():
            if self.context['user'] in i.values():

                return self.context['user']

in the view:

class CommentView(viewsets.ModelViewSet):
    serializer_class = serializer.CommentSerializer

    def get_serializer_context(self): #adding request.user as an extra context
        context = super(CommentView,self).get_serializer_context()
        context.update({'user':self.request.user})
        return context

as you can see, i have overridded get_serializer_context to add user as a context

however, in the serializer side, i am getting KeyError:'user' means the key does not exist, any idea how to set a context?

Upvotes: 1

Views: 57

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477318

This is not necessary and inefficient. You can just annotate with:

from django.db.models import Exists, OuterRef


class CommentView(viewsets.ModelViewSet):
    serializer_class = serializer.CommentSerializer

    def get_queryset(self):
        return Comment.objects.annotate(
            user_like=Exists(
                Like.objects.filter(
                    comment_id=OuterRef('pk'), user_id=self.request.user.pk
                )
            )
        ).prefetch_related('likes')

In the serializer we then add the user_like field:

class CommentSerializer(serializers.ModelSerializer):
    likes = CustomUserSerializer(many=True)
    user_like = serializers.BooleanField(read_only=True)

    class Meta:
        fields = ('likes',)
        model = models.Comment

Upvotes: 1

Related Questions