簡體   English   中英

使用 Django 中的單個 INNER JOIN 查詢從多個表中獲取值

[英]Getting values from multiple tables with a single INNER JOIN like query in Django

我正在嘗試在 Django 中創建一個簡單的 Hangman 游戲。 我有兩種模型,一種用於單詞列表,另一種用於用戶玩的游戲,它們之間定義了外鍵關系。 這是 model 定義:

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])

但這似乎是一種相當多余的做事方式,原因有兩個:

  1. 我無法使用 model 中定義的關系
  2. 如果我有 3-4 個如此相關的表,那么我將不得不為每個表一個一個地進行查詢,這完全違背了 ORM 的目的。

那么有沒有更好的方法來做到這一點?

我不確定我是否正確理解了您的問題,但我認為您可能需要使用.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

這是否回答你的問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM