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