0

我有一个挑战课程,人们可以投票给它。现在,每投给用户一票,用户将获得 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 

但我想知道我是否可以在过滤查询集的过程中立即做到这一点并获得更高的性能。

4

1 回答 1

2

是的,您可以使用选民人数来注释挑战对象:

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
于 2013-04-12T12:01:39.830 回答