Как перенести изменения Django в несколько баз данных
У меня есть проект Django 1.11, содержащий три приложения, page
, book
, а также fruit
, Все модели в page
а также book
приложения существуют в базе данных по умолчанию page_db
тогда как все модели в fruit
приложение существует на отдельном fruit_db
База данных, которую я указываю через маршрутизатор базы данных, например:
class MyRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label in ('page', 'book'):
return 'page_db'
elif model._meta.app_label == 'fruit':
return 'fruit_db'
def db_for_write(self, model, **hints):
if model._meta.app_label in ('page', 'book'):
return 'page_db'
elif model._meta.app_label == 'fruit':
return 'fruit_db'
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == obj2._meta.app_label:
return True
def allow_migrate(self, db, app_label, model_name=None, **hints):
if db == 'fruit_db':
allowed = app_label == 'fruit'
elif db == 'page_db':
allowed = app_label in ('page', 'book')
else:
allowed = None
return allowed
Запуск миграций для page
а также book
приложения работают нормально. Тем не менее, когда я пытаюсь запустить миграцию для fruit
приложение с:
manage.py migrate fruit --database=fruit_db
Я получаю ошибку:
Traceback (most recent call last):
File "manage.py", line 9, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
utility.execute()
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 356, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 86, in handle
executor.loader.check_consistent_history(connection)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/migrations/loader.py", line 298, in check_consistent_history
connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration book.0001_initial is applied before its dependency page.0001_initial on database 'fruit_db'.
Итак, хотя я указываю приложение для миграции и базу данных для запуска миграции, Django, похоже, пытается перенести другие приложения. Почему это? book
Первоначальная миграция приложения зависит от page
начальная миграция приложения, но ничего в fruit
приложение зависит от любого book
или же page
Так почему же Django пытается их перенести? Есть проблема с моим роутером?
Как я могу исправить эту ошибку?