Граф forengkey django остальные рамки? - PullRequest
0 голосов
/ 24 апреля 2020

Когда я подсчитываю лайки, я получаю все данные из базы данных. Я бы хотел посчитать только лайки, связанные со статьей

class ArticleSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    comments = CommentSerializer(read_only=True, many=True)
    likes = serializers.SerializerMethodField(read_only=True)


class Meta:
    model = Article
    fields = "__all__"

def get_likes(self, value):
    return Vote.objects.select_related('article').filter(value=True).count()

1 Ответ

1 голос
/ 24 апреля 2020

Я думаю, вы можете попробовать вот так:

def get_likes(self, obj):
    # if you have related_name='votes' in Vote model
    # then it will be obj.votes.count()
    # else
    return obj.vote_set.count()

или вы можете попробовать эффективное решение. Для этого обновленного набора запросов:

from django.db.models import Count

class API(ListAPIView):
    queryset = Article.objects.annotate(vote_count=Count('vote'))

И измените сериализатор:

class ArticleSerializer(serializers.ModelSerializer):
    author = UserSerializer(read_only=True)
    comments = CommentSerializer(read_only=True, many=True)
    likes = serializers.IntegerField(
        source='vote_count', 
        read_only=True
    )

Причина этого эффективность заключается в том, что он не запрашивает базу данных для каждого счетчика, скорее делать это один раз, когда набор запросов оценивается.

...