过滤查询集时,ManytoMany字段上的Count()?

时间:2013-04-12 11:59:05

标签: django

我有一个挑战课,人们可以投票给它。现在,对于为用户投的每个投票,用户将获得5分。

我用for循环解决了它。

class Challenge(models.Model):
    speaker = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='speaker')
    voters  = models.ManyToManyField(settings.AUTH_USER_MODEL, , null=True, blank=True)    

score = 0
challenges = Challenge.objects.filter(speaker=user)
    for challenge in challenges:
        score = score + challenge.voters.count() * 5 

但是我想知道我是否可以在过滤查询集期间以某种方式做到这一点并获得更高的性能。

1 个答案:

答案 0 :(得分:2)

是的,您可以使用选民计数annotate挑战对象:

from django.db.models import Count

Challenge.objects.filter(speaker=user).annotate(voter_count=Count('voters'))
for challenge in challenges:
    score = score + challenge.voter_count * 5 

或者你可以汇总整个选民数:

score = (Challenge.objects
            .filter(speaker=user)
            .aggregate(vc=Count('voters'))
        )['vc'] * 5