我是 Django 新手,但我正在制作一款游戏,其中一个元素是玩家互相投票。
这是我设置的模型(仅限相关字段)
#models.py
class Game(models.Model):
gamecode = ShortUUIDField(length=4, max_length=4, unique=True)
phasenumber = models.IntegerField(default=1)
isActive = models.BooleanField(default=True)
class Player(models.Model):
game = models.ForeignKey(Game, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
isPlaying = models.BooleanField(default=True)
class PlayerVote(models.Model):
byplayer = models.ForeignKey(Player, on_delete=models.CASCADE)
forplayer = models.ForeignKey(Player, on_delete=models.CASCADE, related_name="voteforplayer")
gamephasenumber = models.IntegerField()
timestamp = models.DateTimeField(auto_now_add=True)
当用户加入游戏时,他们会在“玩家”模型中获得一个条目,当他们为其他玩家投票时,会在“PlayerVote”模型中添加一个条目,显示哪个玩家投票(由玩家)以及他们投票给了谁(对于玩家)。
我想做的是创建一个查询集,其中包含每个玩家以及他们获得了多少票。
我尝试过使用annotate,它似乎可以给我一个投票数的统计,但它默认加入byplayer字段,所以我最终得到的是每个玩家投的票数,而不是投票数每个玩家收到的选票。
在 SQL 中,我只需对 Player.pk = PlayerVote.forplayer.pk 进行连接,是否可以在 Django 中执行类似的操作?
或者,我可以创建一个额外的模型来总结每个玩家收到的选票,并为每投票增加 1,但这似乎没有必要
.annotate(…)
[Django-doc]:
from django.db.models import Count
Player.objects.annotate(score=Count('voteforplayer'))
由此
Player
产生的 QuerySet
对象将具有一个额外的属性 .score
,其中包含 PlayerVote
的数量,但以 forplayer_id
代替。