다음은 문제를 해결하는 방법입니다 (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_id
에 app_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)
입니다.
마이그레이션을 실행하면 계층 구조가 업데이트되었습니다.
그냥 지적하십시오 : 스키마 변경에 데이터 마이그레이션을 사용하고 있습니다. 데이터베이스 테이블 구조를 변경하는 경우 데이터 마이그레이션이 아닌 스키마 마이그레이션이어야합니다. 기본적으로, 당신이''south.db.db. *''를 사용한다면 그것은 스키마 이전입니다. –
@MatthewSchinckel 이것을 지적 해 주셔서 감사합니다. '--empty' 플래그를 지정하여 사용자 정의 스키마 마이그레이션을 수행 할 수 있다는 것을 알지 못했습니다. 귀하의 의견을 바탕으로 3 단계와 4 단계가 사용자 정의'schemamigrations'되도록 답변을 업데이트하고 있습니다. – HorseloverFat