我正在努力创建一个简单的行刑者游戏在姜戈。 我有两个模型,一个用于单词列表,一个用于用户玩的游戏,它们之间定义了一个外键关系。 这是模型定义:
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])
但这似乎是一种相当多余的做事方式,原因有二:
那么有没有更好的方法来做到这一点呢?
使用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
回答你的问题了吗?