2016-11-04 47 views
0

我遇到了django子查詢的問題。當我獲取原始的QuerySet時,我指定了需要使用的數據庫。我的直覺是後面的子查詢最終使用「默認」數據庫而不是父查詢使用的。django子查詢使用的數據庫是否粘滯?

我的模型大約看起來像這樣(我有幾個): -

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 

我的問題是在某些情況下,在我的實時服務器上,任意子查詢都會失敗,即使該作者的ID有有效數據。我懷疑是子查詢沒有使用相同的數據庫'some_db'。這可能嗎?這是否使得需要使用的數據庫在子查詢中不粘?這只是一個預感,這可能是一個問題,它發生在芹菜工人的背景下,芹菜與django ORM的組合是否有一些缺陷?

我已經通過調用select_related這樣來解決這個問題。

b_det = Book.objects.using('some_db').select_related('author').filter(book_name = 'Mark') 

所以現在,爲我解決問題的唯一辦法就是事先確定所有我需要的數據,並確保最高級別取了所有使用select_related這些內部模型引用。任何想法爲什麼這樣會失敗?

我無法在本地重新創建,否則我會調試它。就像我說的那樣,它非常隨意。

回答

0

好吧,我現在有一個處理。我假設子查詢將保持粘貼到原始數據庫是錯誤的。 django所做的一件事就是首先擊中配置的數據庫路由器。如果僅在這種情況下它不返回任何東西,它將利用原始數據庫。

所以,如果配置的數據庫路由器返回一些要使用的數據庫,那麼就會被使用。在我看來這是錯誤的,我們需要先使用原始數據庫,然後檢查數據庫路由器。

相關問題