Как предотвратить многократное выполнение метода get сериализатора Django

У меня есть сериализатор, выполняющий вызовы других сериализаторов, чтобы создать один объект Article, содержащий все данные, необходимые для фронтенда.

Все работает как ожидалось, за исключением того, что метод get_sentiment() вызывается несколько раз, и я не могу понять, почему.

Я попытался скопировать поведение из сериализатора Tag, который выдает один список, содержащий все необходимые теги. По какой-то причине поле article_sentiment выдает несколько списков.

Если есть какие-либо соображения о том, почему DRF ведет себя именно так, буду очень признателен.

Вот сериализаторы.

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'tag',
        )
        model = Tag
        
       
class SentimentSerializer(serializers.Serializer):
    sentiment=serializers.SerializerMethodField()
    class Meta: 
        fields = (
            'sentiment',
        )
        model = Reaction
        
    def get_sentiment(self, obj):
        likes = Reaction.objects.filter(article_id=obj.article_id, sentiment=1).count()
        dislikes = Reaction.objects.filter(article_id=obj.article_id, sentiment=2).count()
        if likes + dislikes == 0:
            return 0
        else:
            percent = (likes / (likes + dislikes)) * 100
            print(obj.article_id.title + str(percent))
            items = [likes, dislikes, percent]
            return items
            
    


"""
Gets the full details of an Article
"""
class ArticleSerializer(serializers.ModelSerializer):
    article_tags = TagSerializer(many=True, read_only=True)
    article_sentiment = SentimentSerializer(many=True, read_only=True)
    class Meta:
        fields = (
            'id',
            'title',
            'content',
            'article_tags',
            'pub_date',
            'preview_image',
            'author',
            'author_profile_name',
            'article_sentiment',
        )
        model = Article

Вот результат output of API call

спасибо

Переместите поле SerializerMethodField в ArticleSerializer:

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'tag',
        )
        model = Tag

"""
Gets the full details of an Article
"""
class ArticleSerializer(serializers.ModelSerializer):
    article_tags = TagSerializer(many=True, read_only=True)
    sentiment = serializers.SerializerMethodField()
    class Meta:
        fields = (
            'id',
            'title',
            'content',
            'article_tags',
            'pub_date',
            'preview_image',
            'author',
            'author_profile_name',
            'sentiment',
        )
        model = Article

    def get_sentiment(self, obj):
        likes = Reaction.objects.filter(article_id=obj.id, sentiment=1).count()
        dislikes = Reaction.objects.filter(article_id=obj.id, sentiment=2).count()
        if likes + dislikes == 0:
            return 0
        else:
            percent = (likes / (likes + dislikes)) * 100
            print(obj.title + str(percent))
            items = [likes, dislikes, percent]
            return items
Вернуться на верх