我正在嘗試在 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
提交
取消