Tôi đang dự định đổi tên một số mô hình trong một dự án Django hiện có nơi có nhiều mô hình khác có mối quan hệ khóa ngoại với các mô hình mà tôi muốn đổi tên. Tôi khá chắc chắn điều này sẽ yêu cầu nhiều lần di chuyển, nhưng tôi không chắc về quy trình chính xác.
Giả sử tôi bắt đầu với các mô hình sau trong ứng dụng Django có tên 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()
Tôi muốn đổi tên Foo
mô hình vì tên này không thực sự có ý nghĩa và gây nhầm lẫn trong mã, và Bar
sẽ làm cho tên rõ ràng hơn nhiều.
Từ những gì tôi đã đọc trong tài liệu phát triển Django, tôi giả sử chiến lược di chuyển sau:
Bước 1
Sửa đổi 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()
Lưu ý AnotherModel
tên trường foo
không thay đổi, nhưng mối quan hệ được cập nhật cho Bar
mô hình. Lý do của tôi là tôi không nên thay đổi quá nhiều cùng một lúc và nếu tôi đổi tên trường này thành bar
tôi sẽ có nguy cơ mất dữ liệu trong cột đó.
Bước 2
Tạo một di chuyển trống:
python manage.py makemigrations --empty myapp
Bước 3
Chỉnh sửa Migration
lớp trong tệp di chuyển được tạo ở bước 2 để thêm RenameModel
thao tác vào danh sách thao tác:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Bước 4
Áp dụng di chuyển:
python manage.py migrate
Bước 5
Chỉnh sửa tên trường liên quan trong 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()
Bước 6
Tạo một di chuyển trống khác:
python manage.py makemigrations --empty myapp
Bước 7
Chỉnh sửa Migration
lớp trong tệp di chuyển được tạo ở bước 6 để thêm RenameField
(các) thao tác cho bất kỳ tên trường liên quan nào vào danh sách hoạt động:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Bước 8
Áp dụng di chuyển thứ 2:
python manage.py migrate
Ngoài việc cập nhật phần còn lại của mã (dạng xem, biểu mẫu, v.v.) để phản ánh tên biến mới, về cơ bản, chức năng di chuyển mới này sẽ hoạt động như thế nào?
Ngoài ra, điều này có vẻ như rất nhiều bước. Các hoạt động di chuyển có thể được ngưng tụ theo một cách nào đó?
Cảm ơn!