Как можно модифицировать данные до сериализации в Django Rest Framework?

У меня есть 2 основные модели: Story и Comment

class StoryAndComment(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    body = models.TextField(max_length=500)
    edit_date = models.DateTimeField(auto_now=True)
    pub_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True


class Story(StoryAndComment):
    CATEGORIES_LIST = (
        ('Different', 'Different'),
        ('Funny', 'Funny'),
        ('Dirty', 'Dirty'),
        ('Scary', 'Scary'),
        ('Hatred', 'Hatred'),
        ('Weird', 'Weird'),
        ('Mystic', 'Mystic'),
        ('Shame', 'Shame'),
        ('Politics', 'Politics'),
        ('Envy', 'Envy'),
        ('Cruelty', 'Cruelty'),
        ('Laziness', 'Laziness'),
        ('Cats', 'Cats'),
        ('Childhood', 'Childhood'),
        ('Dreams', 'Dreams'),
        ('Family', 'Family'),
        ('Job', 'Job'),
        ('Happiness', 'Happiness'),
        ('Friendship', 'Friendship'),
        ('Hobby', 'Hobby'),
        ('Love', 'Love'),
        ('Music', 'Music'),
    )
    title = models.TextField(max_length=120)
    category = models.CharField(max_length=30, choices=CATEGORIES_LIST, default="Different")

    class Meta:
        verbose_name_plural = "Stories"

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("story_comments", kwargs={"pk": self.pk})


class Comment(StoryAndComment):
    story = models.ForeignKey(Story, related_name="comments", on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural = "Comments"

    def __str__(self):
        return self.body[0:20] + "..."


и код для view. Когда клиент запрашивает список всех постов выполняется код из view:
@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticatedOrReadOnly])
def stories_list_api(request):
    if request.method == 'GET':
        stories = Story.objects.all().order_by('-pub_date')
        serializer = StorySerializer(stories, many=True)
        return Response(serializer.data)


Код сериализации:
class CommentSerializer(serializers.ModelSerializer):
    comment_likes = CommentLikeSerializer(many=True, read_only=True)

    class Meta:
        model = Comment
        fields = '__all__'
        extra_kwargs = {
                        'author': {'required': False},
                        'story': {'required': False}
        }


class StorySerializer(serializers.ModelSerializer):
    comments = CommentSerializer(many=True, read_only=True)
    story_likes = StoryLikeSerializer(many=True, read_only=True)

    class Meta:
        model = Story
        fields = '__all__'
        extra_kwargs = {
                        'author': {'required': False}
        }


Так вот результатом приходит json где в поле comments есть массив из всех comments. Но так как для главной страницы мне не нужно выводить сами комментарии, а только их количество мне надо в поле comments записать что то в виде Comment.objects.all().count() для каждой story. Вопрос как мне это сделать. Были идеи с models.Manager в самом models.py, или при сохранении в serializers.py или при выборке данных в views.py
  • Вопрос задан
  • 468 просмотров
Решения вопроса 1
@MAGistr_MTM
Учусь программировать
Думаю суть вловите
class GroupSerializer(serializers.ModelSerializer):

    user_count = serializers.SerializerMethodField()

    class Meta:
        model = Group
        fields = ('id', 'name','user_count')

    def get_user_count(self, obj):
        return obj.user_set.count()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kentuck1213
@kentuck1213
Напишите другую view и serializer для главной странице.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы