Как предотвратить многократное выполнение метода 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
спасибо
Переместите поле 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