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". Затем увеличивать или уменьшать это поле каждый раз после запроса пользователя.