2011-08-02 4 views
2

내 Django 모델 중 하나는 서브 클래스이며 원래 클래스와 매우 유사한 슈퍼 클래스로 변경하려고합니다. 특히 새 수퍼 클래스는 동일한 객체를 설명하고 동일한 기본 키를가집니다. South에서 새 OneToOne 필드를 만들고 이전 값을 새 값으로 복사하려면 어떻게해야합니까?남쪽에서 이전 열의 값을 새 열로 복사 할 수 있습니까?

답변

11

남쪽에는 스키마 마이그레이션과 데이터 마이그레이션이라는 두 가지 마이그레이션 유형이 있습니다.

당신이 schemamigration를 생성 한 후, 해당 데이터 마이그레이션 만들 :

./manage.py datamigration <app> <migration_name>

는 (아직) 마이그레이션을 실행하지 마십시오을. 대신, 방금 작성한 마이그레이션 파일을여십시오.

forwards()이라는 메서드가 있습니다. 여기에 이전 테이블의 값을 새 테이블에 복사하는 절차를 정의합니다.

주어진 테이블의 구조를 좀 더 복잡한 레이아웃으로 변경하는 경우 일반적인 방법은 데이터 마이그레이션과 관련하여 두 가지 스키마 마이그레이션을 수행하는 것입니다. 첫 번째 스키마 마이그레이션은 필드를 추가하고 데이터 이전은 이전 필드를 새 필드 및 두 번째 스키마 마이그레이션은 이전 필드를 삭제합니다. 액세스중인 스키마 (이전 또는 현재)를 추적하는 한 forwards() 메소드를 사용하여 데이터베이스와 관련된 모든 작업을 수행 할 수 있습니다. 일반적으로, 당신은 orm.-related에서 읽고 전통적인 Django 접근 자에게 글을 씁니다.

South Data Migration Tutorial에 자세히 설명되어 있습니다. 이 문서에서는 South의 orm 참조를 사용하여 스키마 마이그레이션 이전의 스키마를 사용하여 데이터베이스에 액세스하는 방법을 보여주고 Django가 이해할 수없는 필드에 대해 불평하지 않고 데이터베이스에 액세스 할 수 있도록합니다.

클래스의 이름을 바꾸는 경우 까다로운 작업 일 수 있습니다. 새 테이블을 만들고 다른 테이블로 이전하고 이전 테이블을 삭제해야합니다. South는이를 수행 할 수는 있지만 스키마와 데이터 마이그레이션을 이동하는 데는 한 번 이상 걸릴 수 있습니다.

South에는 backwards() 메서드도 있습니다.이 메서드를 사용하면 데이터베이스 테이블을 이전 단계로 되돌릴 수 있습니다. 어떤 경우에는 이것이 불가능할 수도 있습니다. 새 테이블은 다운 그레이드에서 손실 될 정보를 기록 할 수 있습니다. 디버그 모드가 아닌 경우 backwards()에 예외를 던지는 것을 권장합니다.

관련 문제