我是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)

当用户加入游戏时,他们在"玩家"模型中获得一个条目,当他们为另一个玩家投票时,一个条目被添加到"玩家投票"模型中,显示哪个玩家投票(by玩家)和他们投票给谁(for玩家).

我想做的是创建一个包含每个玩家和他们得到多少票的查询集.

我试过使用注释,它似乎可以给我一个投票数的计数,但它默认为加入byplayerfield,所以我最终得到的是每个玩家投的票数,而不是每个玩家收到的票数.

在SQL中,我只会在Player.pk=PlayerVote.forplayer.pk上连接,在Django中可以做类似的事情吗?

或者,我可以创建一个额外的模型,总结每个玩家收到的选票,每投一票就增加1,但这似乎没有必要,

推荐答案

您可以使用.annotate(…) [Django-doc]:

from django.db.models import Count

Player.objects.annotate(score=Count('voteforplayer'))

由这个QuerySet产生的Player个对象将有一个额外的属性.score,它包含PlayerVote的数量,但与forplayer_id代替.

Python相关问答推荐

更改matplotlib彩色条的字体并勾选标签?

从webhook中的短代码(而不是电话号码)接收Twilio消息

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

Select 用a和i标签包裹的复选框?

删除所有列值,但判断是否存在任何二元组

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

Python,Fitting into a System of Equations

Python解析整数格式说明符的规则?

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

如何在图中标记平均点?

在两极中过滤

使用特定值作为引用替换数据框行上的值

Flask Jinja2如果语句总是计算为false&

导入错误:无法导入名称';操作';

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG

如何在python tkinter中绑定键盘上的另一个回车?

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?

Pandas:新列,从列表中采样,基于列值

Python键盘模块不会立即检测到按键