Сбой 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