2013-07-17 3 views
8

У меня есть приложение (назовем его MyApp) в проекте Django 1.5. MyApp определяет пользовательскую модель пользователя (MyUser). В проекте используется другое приложение (AnotherApp), которое ссылается на MyUser. MyApp ссылается на поля в AnotherApp.Django south circle dependency

Все работает отлично на моем ноутбуке разработки. Я пытаюсь развернуть мой проект на сервере, и когда я прихожу на этап переноса, MyApp терпит неудачу из-за зависимости с AnotherApp, а AnotherApp терпит неудачу в зависимости от MyApp (я пробовал самостоятельно переносить приложения). Оба отказались от их соответствующих первых миграций (0001)

Running migrations for myapp: 
- Migrating forwards to 0017_auto__blah_blah. 
> myapp:0001_initial 
FATAL ERROR - The following SQL query failed: ALTER TABLE "myapp_mymodel_othermodel" ADD CONSTRAINT "othermodel_id_refs_id_ae052c6d" FOREIGN KEY ("othermodel_id") REFERENCES "anotherapp_othermodel" ("id") DEFERRABLE INITIALLY DEFERRED; 
The error was: relation "anotherapp_othermodel" does not exist 

Error in migration: myapp:0001_initial 
DatabaseError: relation "anotherapp_othermodel" does not exist 


Running migrations for anotherapp: 
- Migrating forwards to 0008_blah_blah. 
> anotherapp:0001_initial 
FATAL ERROR - The following SQL query failed: ALTER TABLE "anotherapp_othermodel" ADD CONSTRAINT "creator_id_refs_id_cff6fecf" FOREIGN KEY ("creator_id") REFERENCES "myuser" ("id") DEFERRABLE INITIALLY DEFERRED; 
The error was: relation "myuser" does not exist 

Error in migration: anotherapp:0001_initial 
DatabaseError: relation "myuser" does not exist 

Любые идеи?

+0

Существует (закрытый) билет для этой проблемы (http://south.aeracode.org/ticket/390), который имеет хорошее обсуждение темы. –

ответ

11

Здесь, как представляется, существует настоящая круговая зависимость. Вы можете легко разбить его: Переместите создание таблицы m2m в MyApp для отдельной миграции. Самый простой способ сделать это, вероятно, - скопировать 0001_initial.py в новое имя, а затем удалить блоки для таблицы m2m (вперед и назад!) В оригинале и удалить все остальное в копии.

Копия должна быть названа так, чтобы она была заказана между 0001_initial и 0002_whatever - say, 0001_initial2.py; и это должно зависеть от («AnotherApp», «0001_initial»), что, в свою очередь, должно зависеть от («MyApp», «0001_initial»).

+1

Отлично! Я закончил использование need_by в самом первом переносе для MyApp, а затем second_on для второй миграции для MyApp. Это позволило мне настроить зависимости без необходимости модификации AnotherApp (который разработан в другом месте) – askvictor