2016-02-19 109 views
1

這是已知的問題,遷移忽略數據庫路由。 已知的解決方案是使用參數 - 數據庫進行「手動」路由,並分別遷移每個應用程序。如何在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)會警告:「您有未應用的遷移。」

我發現的唯一的解決方法是禁用所有的貢獻的東西(包括管理網址),然後做遷移,然後將其關閉。

結果是不潔的。

回答

0

您可以在路由器中使用allow_migrate方法處理它。如果您的應用程序fooapp應該在數據庫foo,那麼請確保內容類型應用程序也在那裏。例如:

class DumbDbRouter(object) 
    # ... 
    def allow_migrate(self, db, app_label, model_name=None, **hints): 
     if db == 'foo': 
      return app_label in ['fooapp', 'contenttypes'] # <-- PAY ATTENTION 
     elif app_label == 'fooapp': 
      return False 
     return None 

閱讀文檔here

  • 每個contenttypes.ContentType的之一,sessions.Session和sites.Site可以存儲在任何數據庫,給出一個合適的路由器

希望它有幫助!

+0

你的意思是我需要在所有數據庫上分發contenttype表的內容嗎? 它如何工作? – qMax

+0

您應該在每個與應用程序相關的非默認數據庫(如'foo')上使用遷移來分發內容類型。它需要django_migration表(在非默認數據庫中),它依賴於contenttype表。默認情況下,contenttype表存儲在默認數據庫中。在其他數據庫中,您應該手動存儲使用數據庫路由器的contenttype表。 –

+0

引用的文檔說,admin和auth模型依賴於contenttypes,並且應該存儲在同一個數據庫中。這可能需要在每個獲得授權的數據庫中複製授權模型。 – qMax