Сбой Django Rest Framework при установке нового контекста для сериализатора

Время Django:

Я столкнулся с проблемой при предоставлении контекста сериализатору:

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']

в представлении:

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

Как вы можете видеть, я переопределил get_serializer_context, чтобы добавить пользователя в качестве контекста

однако, на стороне сериализатора я получаю KeyError:'user' значит ключ не существует, есть идеи как установить контекст?

Я думаю, что ошибка в вашем сериализаторе

def get_user_like(self,obj):
    for i in obj.likes.all():
        if self.context['user'] in i.values():

            return self.context['user']

        return self.context['user']

Попробуйте это

def get_user_like(self,obj):
    return self.context['user']

Пример

    # from views.py
    def get_serializer_context(self):
        return {'user': self.request.user}
    #in serializers.py
    class ProductSerializer(serializers.ModelSerializer):
            [...]
        
            def create(self, validated_data):
                user = self.context['user']

У меня это работает нормально. Если не работает, проверьте, что вы отправляете из представления и получаете в сериализаторе с помощью отладчика.

Это не обязательно и неэффективно. Вы можете просто аннотировать с:

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')

В сериализаторе мы добавляем поле user_like:

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

    class Meta:
        fields = ('likes',)
        model = models.Comment
Вернуться на верх