2015-10-08 60 views
3

看看這個Django的ORM代碼:在Django中,我可以在創建對象時指定數據庫嗎?

my_instance = MyModel() 
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id) 

在這一點上,在第二行,Django將拋出一個錯誤:

ValueError: Cannont assign "<OtherModel: ID>": instance is on database "default", value is on database "other_db" 

對我來說,並沒有太大的意義。 Django的如何分辨哪個數據庫my_instance,如果我還沒有叫:

my_instance.save(using='some_database') 

了嗎?

我想,在構建對象期間,Django會自動將其分配給default數據庫。我可以改變它嗎?創建對象時,我可以通過將參數傳遞給它的構造函數來指定數據庫嗎?根據文檔,創建對象時唯一可以傳遞的參數是其字段的值。那麼我該如何解決我的問題?

在Django的1.8有一個叫Model.from_dbhttps://docs.djangoproject.com/en/1.8/ref/models/instances/),但我使用Django的早期版本,並且現在不能切換到新的新方法。縱觀實現它是所有調節兩個模型的屬性:

instance._state.adding = False 
instance._state.db = db 

因此,這將是足夠我的代碼更改爲:

my_instance = MyModel() 
my_instance._state.adding = False 
my_instance._state.db = 'other_db' 
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id) 

,或者是來不及做,因爲那些標誌在構造函數中使用,並且只能在構造函數中設置?

回答

1

你可能想看看從Django 1.2開始支持的database routing。這將允許您爲不同型號設置多個數據庫(或「路由器」)。

您可以創建自定義數據庫路由器(一類從內置object型繼承),與應該用於​​和db_for_write方法,返回該數據庫的名稱(如DATABASES設置中定義)模型傳入該方法。讓Django知道它返回None

它通常用於處理主從複製,因此您可以從可寫入的數據庫中創建一個單獨的只讀數據庫,但是同樣的邏輯適用於讓您指定某些數據庫中存在某些模型。

你可能也想定義allow_syncdb方法,所以只有您希望出現在數據庫B的車型將出現在那裏,一切將出現在數據庫A

相關問題