我對使用django ORM的django子查詢感到擔憂。當我們獲取查詢集或執行數據庫操作時,我可以選擇繞過django可能爲數據庫所做的所有假設,通過強制使用我想要的特定數據庫來使用數據庫。爲什麼Django子查詢使用的數據庫不粘?
b_det = Book.objects.using('some_db').filter(book_name = 'Mark')
以上無視任何數據庫路由器,我可能已設置並直接進入'some_db'。
但如果我的模型大約看起來像這樣: -
class Author(models.Model):
author_name=models.CharField(max_length=255)
author_address=models.CharField(max_length=255)
class Book(models.Model):
book_name=models.CharField(max_length=255)
author=models.ForeignKey(Author, null = True)
我取表示被稱爲馬克像這樣所有書籍查詢集: -
b_det = Book.objects.using('some_db').filter(book_name = 'Mark')
再後來,如果某處代碼我觸發子查詢通過做這樣的事情: -
if b_det:
auth_address = b_det[0].author.author_address
然後這不會讓你它是我早期爲主查詢指定的原始數據庫'some_db'的一部分。這又通過路由器並拾取(可能)不正確的數據庫。
爲什麼Django會這樣做。恕我直言,如果我選擇了原始查詢的數據庫強制使用,那麼即使是子查詢也需要使用同一個數據庫。數據庫路由器爲什麼必須爲此而出現?
我不認爲使用select_related是一個選項,因爲我事先並不知道我可能需要執行哪些內部連接。在我的實現中,有6級使用外鍵引用的表。如果我把所有東西都放在select_related中,那麼每次都會成爲一個大規模的查詢。 – abhayAndPoorvisDad
在您的問題中未提及六種不同的查詢。我所回答的是你原來的問題。 – e4c5
好的select_related是解決問題的一種方法。 – abhayAndPoorvisDad