2016-11-07 46 views
2

我對使用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會這樣做。恕我直言,如果我選擇了原始查詢的數據庫強制使用,那麼即使是子查詢也需要使用同一個數據庫。數據庫路由器爲什麼必須爲此而出現?

回答

0

這不是嚴格的SQL意義上的子查詢。你實際上在這裏做的是執行一個查詢並使用它的結果來查找相關的項目。

你可以連續使用的過濾器,做很多其他的操作對查詢集,但它不會被執行,直到你把它切片或致電.values(),但在這裏,你實際上是採取了分片

auth_address = b_det[0].#rest of code 

所以你有一個物化查詢,你現在試圖找到相關作者的地址,這需要另一個查詢,但你沒有使用,所以django可以自由選擇使用哪個數據庫。你可以通過使用來克服這個問題select_related

+0

我不認爲使用select_related是一個選項,因爲我事先並不知道我可能需要執行哪些內部連接。在我的實現中,有6級使用外鍵引用的表。如果我把所有東西都放在select_related中,那麼每次都會成爲一個大規模的查詢。 – abhayAndPoorvisDad

+0

在您的問題中未提及六種不同的查詢。我所回答的是你原來的問題。 – e4c5

+0

好的select_related是解決問題的一種方法。 – abhayAndPoorvisDad

相關問題