기존 Django 프로젝트에서 이름을 바꾸려는 모델과 외래 키 관계가있는 다른 모델이 많이있는 여러 모델의 이름을 바꿀 계획입니다. 이 작업을 여러 번 수행해야한다고 확신하지만 정확한 절차는 확실하지 않습니다.
Django 앱에서 다음 모델로 시작한다고 가정 해 봅시다 myapp
.
class Foo(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_ridonkulous = models.BooleanField()
Foo
이름이 실제로 이해되지 않고 코드에서 혼동을 일으키고 Bar
훨씬 명확한 이름을 만들 수 있기 때문에 모델의 이름 을 바꾸고 싶습니다 .
Django 개발 문서에서 읽은 내용에서 다음과 같은 마이그레이션 전략을 가정합니다.
1 단계
수정 models.py
:
class Bar(models.Model): # <-- changed model name
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_ridonkulous = models.BooleanField()
의 AnotherModel
필드 이름은 foo
변경되지 않지만 관계는 Bar
모델 로 업데이트됩니다 . 내 추론은 한 번에 너무 많이 변경해서는 안되며이 필드 이름을로 변경하면 bar
해당 열의 데이터가 손실 될 위험이 있다는 것입니다.
2 단계
빈 마이그레이션을 만듭니다.
python manage.py makemigrations --empty myapp
3 단계
Migration
2 단계에서 작성된 마이그레이션 파일에서 클래스를 편집하여 RenameModel
조작을 조작 목록 에 추가하십시오 .
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
4 단계
마이그레이션을 적용하십시오.
python manage.py migrate
5 단계
다음에서 관련 필드 이름을 편집하십시오 models.py
.
class Bar(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_ridonkulous = models.BooleanField()
6 단계
다른 빈 마이그레이션을 작성하십시오.
python manage.py makemigrations --empty myapp
7 단계
Migration
6 단계에서 작성된 마이그레이션 파일에서 클래스를 편집하여 RenameField
관련 필드 이름에 대한 오퍼레이션을 오퍼레이션 목록에 추가하십시오.
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
8 단계
두 번째 마이그레이션을 적용하십시오.
python manage.py migrate
새 변수 이름을 반영하기 위해 나머지 코드 (보기, 양식 등)를 업데이트하는 것 외에도 기본적으로 새 마이그레이션 기능은 어떻게 작동합니까?
또한 이것은 많은 단계처럼 보입니다. 마이그레이션 작업을 어떤 방식으로 압축 할 수 있습니까?
감사!