DRF: Добавление нескольких аннотированных полей во вложенный сериализатор
Извините, я не могу найти решение в официальной документации. Мой вопрос в том, как я могу добавить несколько аннотированных полей во вложенный сериализатор. Например, у меня есть вычисляемые поля 'likes', 'dislikes' и 'is_voted' для каждого комментария. Я хочу добавить эти поля в другой сериализатор, например, в 'votes'. Но я получаю ошибку
Получили ошибку AttributeError при попытке получить значение для поля
likes
на сериализатораCommentVoteSerializer
. Поле сериализатора может быть названо неверно и не соответствует какому-либо атрибуту или ключу экземпляраRelatedManager
экземпляра. Оригинальный текст исключения был следующим: Объект 'RelatedManager' не имеет атрибута 'likes'.
Вот мой код
views.py
class PostViewSet(viewsets.ModelViewSet):
likes = Count('votes', filter=Q(votes__choice=True))
dislikes = Count('votes', filter=Q(votes__choice=False))
queryset = Post.objects.all().prefetch_related(
Prefetch('comments', queryset=Comment.objects.filter(parent__isnull=True).order_by('-pub_date')
.annotate(likes=likes)
.annotate(dislikes=dislikes)
.prefetch_related(Prefetch('children', queryset=Comment.objects.all()
.annotate(likes=likes)
.annotate(dislikes=dislikes)))))
serializer_class = PostSerializer
permission_classes = [IsOwnerOrAdminOrReadOnly]
pagination_class = PostPagination
lookup_field = 'slug'
def get_serializer_class(self):
""""
Attach related comments
when get post detail
"""
if self.action == 'retrieve':
return PostRetrieveSerializer
return self.serializer_class
def perform_create(self, serializer):
serializer.save(author=self.request.user)
models.py
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
slug = models.SlugField(blank=True)
body = models.TextField()
tags = TaggableManager(blank=True)
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-pub_date']
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE,
related_name='comments')
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
text = models.TextField(max_length=500)
pub_date = models.DateTimeField(auto_now=True)
parent = models.ForeignKey('self', blank=True, null=True,
on_delete=models.CASCADE, related_name='children')
class Meta:
ordering = ['-pub_date']
class Vote(models.Model):
comment = models.ForeignKey(Comment, on_delete=models.CASCADE,
related_name='votes')
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
choice = models.BooleanField(null=True)
serializers.py
class CommentVoteSerializer(serializers.ModelSerializer):
likes = serializers.IntegerField()
dislikes = serializers.IntegerField()
class Meta:
model = Comment
fields = ['likes', 'dislikes']
class CommentChildrenSerializer(serializers.ModelSerializer):
author = AuthorInfoSerializer(read_only=True)
likes = serializers.IntegerField()
class Meta:
model = Comment
fields = ['author', 'id', 'text', 'pub_date', 'parent', 'likes']
class CommentSerializer(serializers.ModelSerializer):
author = AuthorInfoSerializer(read_only=True)
children = CommentChildrenSerializer(many=True)
votes = CommentVoteSerializer(read_only=True)
class Meta:
model = Comment
fields = ['author', 'id', 'text', 'pub_date', 'children', 'votes']
Спасибо