2014-01-31 3 views
0

이 작업을 수행하는 방법에 대해 두뇌를 감싸는 데 어려움을 겪고 있습니다. 이전에 완료 한 사람의 사례를보고 싶습니다.계층 구조에 모델을 삽입하기위한 사우스 스키마 마이그레이션 예제

전에, 가정 :

class A(models.Model): 
    pass 

class B(A) 
    pass 

그리고 난에 도착 할 상황은 다음과 같습니다

class A(models.Model): 
    pass 

class C(A): 
    pass 

class B(C): 
    pass 

어떻게 이것에 대한 남쪽 마이그레이션을 작성 가겠어요? '데이터 마이그레이션'을해야합니까?

답변

0

다음은 문제를 해결하는 방법입니다 (4 단계 프로세스입니다). 이것이 개선/단순화 될 수 있는지 여전히 관심이있을 것입니다.

1) 새 모델을 독립 모델로 만듭니다 (예 : (: schemamigration app_name --auto 예)

2) 사용자 정의 datamigration를 사용하여 class A에서 데이터와 새로운 모델 C 채우기

class C(models.Model): 
    pass 

한 다음 자동 스키마 마이그레이션을한다.

def forwards(self, orm): 
    for a in orm.A.objects.all(): 
     c = orm.C(id=a.id) 
     c.save() 

3) 이제 --empty 플래그를 지정하여 (사용자 정의 schemamigration을)과의 id 열 이름을 변경 : 예는 A에서 기존 id와 함께 새로운 모델의 id을 마이그레이션 골격을 만들고 채우는 datamigration app_name populate_C를 실행 id에서 a_ptr_idapp_name_c, 예를 들면 :

def forwards(self, orm): 
    db.rename_column('app_name_c', 'id', 'a_ptr_id') 

이 시점에서 당신이 class C(A)class C(models.Model)을 변경할 수 있습니다 근본적인 테이블은 이제이 새로운 현실을 반영하기 때문입니다.

4)는 'b_ptr_id'에서 'app_name_b'등의 'a_ptr_id'열 이름을 변경 최종 사용자 정의 schemamigration 수행

def forwards(self, orm): 
    db.rename_column('app_name_b', 'a_ptr_id', 'b_ptr_id') 

그리고이 시점에서 당신이 새로운 현실에 class B(A)을 변경할 수있는 class B(C)입니다.

마이그레이션을 실행하면 계층 구조가 업데이트되었습니다.

+1

그냥 지적하십시오 : 스키마 변경에 데이터 마이그레이션을 사용하고 있습니다. 데이터베이스 테이블 구조를 변경하는 경우 데이터 마이그레이션이 아닌 스키마 마이그레이션이어야합니다. 기본적으로, 당신이''south.db.db. *''를 사용한다면 그것은 스키마 이전입니다. –

+0

@MatthewSchinckel 이것을 지적 해 주셔서 감사합니다. '--empty' 플래그를 지정하여 사용자 정의 스키마 마이그레이션을 수행 할 수 있다는 것을 알지 못했습니다. 귀하의 의견을 바탕으로 3 단계와 4 단계가 사용자 정의'schemamigrations'되도록 답변을 업데이트하고 있습니다. – HorseloverFat