为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Cats萌萌 2023-02-07 16:41:24
我正在尝试在 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 的目的。那么有没有更好的方法来做到这一点?
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

我不确定我是否正确理解了您的问题,但我认为您可能需要使用.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

这是否回答你的问题?


查看完整回答
反对 回复 2023-02-07
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号