ฉันวางแผนที่จะเปลี่ยนชื่อรุ่นหลายรุ่นในโครงการ 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
ใช้การโยกย้ายครั้งที่ 2:
python manage.py migrate
นอกเหนือจากการอัปเดตโค้ดส่วนที่เหลือ (มุมมองฟอร์มและอื่น ๆ ) เพื่อให้สะท้อนถึงชื่อตัวแปรใหม่แล้วนี่คือการทำงานของการย้ายข้อมูลใหม่หรือไม่
นอกจากนี้ดูเหมือนว่าขั้นตอนมากมาย การดำเนินการโยกย้ายสามารถย่อตัวได้หรือไม่?
ขอบคุณ!