2011-09-19 2 views
8

최근 Django 프로젝트에서 마이그레이션을 위해 South를 사용하기 시작했습니다. 최근까지 내가 특이한 문제에 직면했을 때까지 모든 것이 잘 진행되었다.다른 앱에서 South가 수행하는 이전 순서는 무엇입니까?

내 프로젝트에는 App-A와 App-B라는 두 개의 앱이 있습니다. App-A의 모델에는 App-B의 모델에 대한 외래 키가 있습니다. 시스템을 만들려고했을 때 syndb을 실행하여 auth_south_ 테이블을 모두 만들었습니다. 그렇다면 migrate을 실행하여 오류가 발생했습니다. App-B에서 모델을 참조한 App-A에서 모델을 만들려고했지만 아직 App-B 모델이 마이그레이션되지 않았기 때문에 오류가 발생했습니다.

이 문제를 해결하기 위해 App-B를 먼저 수동으로 마이그레이션 한 다음 App-A를 수동으로 마이그레이션해야했습니다. 내가 여기서 뭐 잘못하고 있니? 남한은 앱 전반의 이전 순서를 어떻게 알 수 있습니까?

감사합니다.

답변

16

설명 : https://south.readthedocs.io/en/latest/dependencies.html. 애플 리케이션을위한

마이그레이션 좋네요 'N 모든하지만 많은 응용 프로그램과 더불어, 큰 프로젝트를 쓰기 시작할 때, 당신은 당신이 응용 프로그램과 어떤 순서로 마이그레이션 것 필요 운동 사이의 외래 키 관계를 실현 각 응용 프로그램에 적용되는 것은 고통 스럽습니다.

운 좋게도 우리는이 문제가 있었기 때문에 South는 의존성 시스템을 가지고 있습니다. 마이 그 레이션 내에서 다른 앱이 특정 마이 그 레이션을 먼저 실행하도록하는 것으로 결정할 수 있습니다. 내 응용 프로그램 "포럼"은 "계정"에 의존하는 경우, 예를 들어, 응용 프로그램은 사용자 프로필 테이블을 생성하는 데, 우리는 할 수 있습니다

# forum/migrations/0002_post.py class Migration: 

    depends_on = (
     ("accounts", "0003_add_user_profile"), 
    ) 

    def forwards(self): 

를 그리고, 당신이 시도하고 포럼에서 0002_post 또는 이상으로 마이그레이션하는 경우 앱을 사용하는 경우 먼저 까지 계정이 0003_add_user_profile까지 마이그레이션되었는지 확인하고, 그렇지 않은 경우 계정을 마이 그 레이션합니다.

종속성도 반대입니다. South는 0003_add_user_profile 이전을 실행 취소 할 때까지 0002_post 이주를 실행 취소 할 때까지 실행 취소하지 않습니다.

여러 개의 종속성과 모든 종류의 이상한 구조를 가질 수 있습니다. 그러나, 두 가지 규칙이 있습니다

없음 순환 종속성이 같은 응용 프로그램 없음 위쪽으로 종속 (두 개 이상의 마이그레이션 각 다른에 따라) (그래서 당신은 포럼 응용 프로그램에서 0002_post이 0003_room에 의존 할 수 없습니다 같은 응용 프로그램에서, 하나 을 직접 또는 종속성 체인을 통해.

이 needed_by`는 실제 마이그레이션을 제어하는 ​​것``. 실제로 depends_on` 매우 중요하기 때문에이 투표까지-그냥
12

South는 settings.py의 INSTALLED_APPS 튜플에 표시된 순서대로 앱을 이전합니다. App-B가 settings.py에 App-A보다 먼저 설치되어 있는지 확인하십시오.

+0

. 당신이 경우 내 사례처럼 마이그레이션을 시작하면서 South는 마이그레이션이 완료된 후 앱의 초기 데이터를로드하려고 시도 할 것입니다. 앱의 초기 다큐멘트 그것을 필요로하고 외래 키 문제에 부딪쳤다. 나는 앱을'INSTALLED_APPS'에서 다시 주문함으로써이 문제를 해결할 수있었습니다.South는'INSTALLED_APPS'에있는 순서대로 app을 실행하여 일시적인 마이그레이션 종속성을 실행합니다. – jaywhy13

관련 문제