提问者:小点点

使用一个内部连接从多个表中获取值,如Django中的查询


我正在努力创建一个简单的行刑者游戏在姜戈。 我有两个模型,一个用于单词列表,一个用于用户玩的游戏,它们之间定义了一个外键关系。 这是模型定义:

class WordMaster(models.Model):
    word = models.CharField("Secret Word", max_length=100)
    category = models.CharField("Category", max_length=20)
    sub_category = models.CharField("Sub-category", max_length=50)

class GamesPlayed(models.Model):
    word_id = models.ForeignKey(WordMaster, on_delete=models.DO_NOTHING)
    guessed_letters = models.CharField("Guessed letters", max_length=72, null=True)
    guesses = models.IntegerField("Number of guesses", null=True)
    won = models.BooleanField("Won", null=True)
    start_time = models.DateTimeField("Started", auto_now=True, auto_now_add=False, null=True)

现在当游戏正在进行时,我需要单词连同猜出的字母和猜出的次数。

我将使用纯SQL完成此操作,如下所示:

SELECT * from gamesplayed gp
    JOIN wordmaster wm on gp.word_id = wm.id
    where gp.id = 5

然而,我在Django ORM中找了很多地方都没能找到对等的查询。

所以我最终使用了一个筛选器查询,并在字典中得到了其中一个的结果,然后更新字典以添加来自另一个表的值。 下面是我使用的代码:

g = GamesPlayed.objects.filter(pk=5)
game = list(g.values())[0]
game.update(list(WordMaster.objects.filter(pk=game['word_id_id']).values())[0])

但这似乎是一种相当多余的做事方式,原因有二:

  1. 我无法使用模型中定义的关系
  2. 如果我有3-4个如此相关的表,那么我将不得不对每个表逐个进行查询,这完全违背了ORM的目的。

那么有没有更好的方法来做到这一点呢?


共2个答案

匿名用户

使用select_related(),您可以实现SQLjoin等价物。

您的用途是:

gamesplayed=gamesplayed.objects.filter(wordmaster_id=5).select_related()

匿名用户

我不确定我正确理解了您的问题,但我认为您可能需要使用.select_related()

我用了文件的例子,适用于你的案例

以下是标准查找:

# Hits the database.
gp = GamesPlayed.objects.get(id=5)

# Hits the database again to get the related `WordMaster` object.
word_to_guess = gp.word_id.word

下面是select_related查找:

# Hits the database.
gp = GamesPlayed.objects.select_related('word_id').get(id=5)

# Doesn't hit the database, because `gp.word_id` has been
# prepopulated in the previous query.
word_to_guess = gp.word_id.word

回答你的问题了吗?