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

はい、有権者数で Challenge オブジェクトに注釈を付けることができます。

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 に答える