Python 在Django中使用一个类似内部联接的查询从多个表中获取值
我试图在Django创建一个简单的刽子手游戏。我有两个模型,一个用于单词列表,一个用于用户玩的游戏,它们之间定义了外键关系。这是模型定义:Python 在Django中使用一个类似内部联接的查询从多个表中获取值,python,django,django-models,Python,Django,Django Models,我试图在Django创建一个简单的刽子手游戏。我有两个模型,一个用于单词列表,一个用于用户玩的游戏,它们之间定义了外键关系。这是模型定义: class WordMaster(models.Model): word = models.CharField("Secret Word", max_length=100) category = models.CharField("Category", max_length=20) sub_ca
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])
但这似乎是一种相当多余的做事方式,原因有二:
那么有没有更好的方法呢?我不确定我是否正确理解了您的问题,但我认为您可能需要使用 我使用了文档的例子,应用于您的案例 以下是标准查找:
# 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_相关的查找:
# 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
这回答了你的问题吗?我建议将你的字段
word\u id=models.ForeignKey(WordMaster,…)
重命名为word\u master
,这样语义看起来更好/更容易理解。在您当前的代码中,您必须执行gp.word\u id.word
(并且word\u id
具有误导性,因为它实际上是一个相关对象,而不仅仅是一个id),重命名字段后,您将执行gp.word\u master.word
(更清楚地显示它是一个相关对象)。谢谢,这很有效。有没有办法把所有的值都放在一本字典里?@gouravkr你能详细说明一下你希望在字典里有什么值吗。那么这个dict的键是什么呢?因为我只指定了一个id,所以它总是只返回一行。所以我想把两个表中的所有值都转换成一个dict,并将模型字段名作为键。但是我想我现在可以没有这个部分了,因为我理解了queryset的结构,并且能够在没有dict的情况下完成我的用例。