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

Спасибо

Вернуться на верх