我正在尝试在 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
这是否回答你的问题?
添加回答
举报
0/150
提交
取消