使用单个 INNER JOIN 从多个表中获取值,例如 Django 中的查询

我正在尝试在 Django 中创建一个简单的 Hangman 游戏。我有两个模型,一个用于单词列表,一个用于用户玩的游戏,它们之间定义了外键关系。这是模型定义:


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])

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


我无法使用模型中定义的关系

如果我有 3-4 个如此相关的表,那么我将不得不为每个表一个一个地进行查询,这完全违背了 ORM 的目的。

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


Cats萌萌
浏览 152回答 1
1回答

慕沐林林

我不确定我是否正确理解了您的问题,但我认为您可能需要使用.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这是否回答你的问题?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python