這是已知的問題,遷移忽略數據庫路由。 已知的解決方案是使用參數 - 數據庫進行「手動」路由,並分別遷移每個應用程序。如何在multidb項目中使用admin/auth進行遷移?
但是,當使用contrib apps admin/auth/contenttypes時,應用遷移將觸發post_migrate_signal
,迫使他們檢查可能更改模型的權限擴展,並嘗試在使用--database指定的數據庫中執行該操作然後默認。
特別地,我已經安裝是這樣的:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'foo',
'bar'
}
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR + '/var/db.sqlite'
},
'foo': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'HOST': 'foohost',
'NAME': 'foo'
},
'bar': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': '',
'NAME': 'bar'
}
}
DATABASE_ROUTERS = ['DumbDbRouter'] # simply returns app_label as a target db
要運行的contrib應用的初始遷移,調用分開:
./manage.py migrate auth
./manage.py migrate admin
./manage.py migrate sessions
在此之後,是爲每一個生成的所有那些CONTENTTYPES和權限找到模型。現在
,運行的遷移我的應用程序(無論是初始或順序):
./manage.py migrate foo --database=foo
# fails with error "Error creating new content types.".
跟蹤顯示它從試圖找到表django_contenttypes
數據庫foo
提高。 現在,其他一些操作(例如runserver
)會警告:「您有未應用的遷移。」
我發現的唯一的解決方法是禁用所有的貢獻的東西(包括管理網址),然後做遷移,然後將其關閉。
結果是不潔的。
你的意思是我需要在所有數據庫上分發contenttype表的內容嗎? 它如何工作? – qMax
您應該在每個與應用程序相關的非默認數據庫(如'foo')上使用遷移來分發內容類型。它需要django_migration表(在非默認數據庫中),它依賴於contenttype表。默認情況下,contenttype表存儲在默認數據庫中。在其他數據庫中,您應該手動存儲使用數據庫路由器的contenttype表。 –
引用的文檔說,admin和auth模型依賴於contenttypes,並且應該存儲在同一個數據庫中。這可能需要在每個獲得授權的數據庫中複製授權模型。 – qMax