DRF Добавление нескольких аннотированных полей во вложенный сериализатор

В моем наборе запросов есть несколько аннотированных полей. Я хочу сгруппировать эти поля во вложенный сериализатор. Например

views.py

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all().prefetch_related(
        Prefetch('comments', queryset=Comment.objects.filter(parent__isnull=True).order_by('-pub_date')
                 .annotate(likes=Count('votes', filter=Q(votes__choice=True)), 
                           dislikes=Count('votes', filter=Q(votes__choice=False)))))

Поэтому есть два дополнительных поля 'likes', 'dislikes'

serializers.py

class CommentVoteSerializer(serializers.Serializer):
    likes = serializers.IntegerField(source='comments.likes')
    dislikes = serializers.IntegerField(source='comments.dislikes')

    class Meta:
        fields = ['likes', 'dislikes']


class CommentSerializer(serializers.ModelSerializer):
    rating = CommentLikesSerializer(read_only=True, many=True)

    class Meta:
        model = Comment
        fields = ['id', 'text', 'pub_date', 'rating']

Я пробовал разные способы, но не могу понять, как это исправить. Спасибо за помощь

В классе Meta: Вы забыли модель. если вы даете "рейтинг" как имя переменной в сериализаторе, который вы хотите добавить в поля другого сериализатора, то вам также нужно зайти в models.py и я предполагаю, что у вас там есть поле ManyToMany для голосов, тогда вы должны добавить следующий аргумент related_name="rating".

В вашей модели Votes есть только поле boolean для like и dislike? Если да, то я рекомендую удалить всю таблицу и поле ManyToMany и завести поле IntegerField вместо total votes в "Comment". Затем увеличивать или уменьшать это поле каждый раз после запроса пользователя.

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