Django 连接非外键的字段

问题描述 投票:0回答:1

我是 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,但这似乎没有必要

python django django-models django-views django-queryset
1个回答
0
投票

您可以

.annotate(…)
 [Django-doc]

from django.db.models import Count

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

由此

Player
产生的
QuerySet
对象将具有一个额外的属性
.score
,其中包含
PlayerVote
的数量,但以
forplayer_id
代替。

© www.soinside.com 2019 - 2024. All rights reserved.