【发布时间】:2019-03-13 21:36:12
【问题描述】:
我似乎无法理解 django 中稍微复杂的查询。
我有一个玩家,他玩过游戏。 每个play都有一个多对多的领域,其中有玩过该游戏的玩家。
对于 player1,我如何计算他用 django orm 打得最多的对手?
在 SQL 中,我猜这可以从多对多表中计算出来,类似于:
SELECT player_id, count(*)
FROM play_player
WHERE play_id in (SELECT play_id FROM play_player WHERE player_id = 'player1_id')
这些是我的模型:
class Game(models.Model):
"""A game to be played and/or owned"""
name = models.CharField(max_length=255)
class Player(models.Model):
"""Someone who plays games"""
name = models.CharField(max_length=255)
games = models.ManyToManyField(Game)
class Play(models.Model):
"""Players have played a game"""
name = models.CharField(max_length=50, null=True, blank=True)
description = models.TextField(max_length=250, null=True, blank=True)
date = models.DateField(
default=timezone.now, help_text='When was the game played?')
game = models.ForeignKey(
Game,
on_delete=models.SET_NULL,
null=True,
help_text='What game was played?')
players = models.ManyToManyField(Player, help_text='Who was playing?')
winner = models.ForeignKey(
Player, on_delete=models.SET_NULL, null=True, related_name='winner')
编辑: 在我在帖子中解释说 SQL 可能类似于对多对多表的查询之后,我对谷歌术语有了一些新的想法。
我会再试一次,如果我很快得到它,我会回答我自己的问题。 昨晚我正在为此猛烈抨击,但可能只需要新的一天。在发帖之前,我需要找一只可以交谈的橡皮鸭。
编辑2: 我在下面发布了自己的答案,仍然乐于接受建议。
【问题讨论】:
-
一场戏有多少人参与?
Play是否意味着每次玩家玩游戏时都会创建Play对象? -
这是为了保存棋盘游戏的分数,所以
Play应该命名为Playthrough。Play是任意数量的Players 播放Game。
标签: django django-models django-orm