儘管我仍然很想知道這種方法是否正確,但我只能通過兩次遷移/提交來了解如何執行上述計劃。
class Foo(models.Model):
A, B, C = 'A', 'B', 'C'
A2, B2, C2, = 1, 2, 3
grade = models.CharField(max_length='1', choices=((A, 'A'), (B, 'B'), (C, 'C')))
new_grade = models.SmallIntegerField(choices=((A2, 1), (B2, 2), (C2, 3)))
class Meta:
ordering = ['x', 'new_grade']
unique_together = ('x', 'new_grade')
後:
首先,我在模型的Meta
類的ordering
和unique_together
字段中添加一個new_grade = models.SmallIntegerField(choices=(1, 2, 3))
場模型(這需要複製枚舉瓦爾),並更新了引用grade
到new_grade
運行manage.py schemamigration app --auto
,我打開遷移文件並將正向方法修改爲:
def forwards(self, orm):
# For the unique_together...
db.delete_unique('app_foo', ['x', 'grade'])
db.add_column('app_foo', 'new_grade',
self.gf('django.db.models.fields.SmallIntegerField')(default=1),
keep_default=False)
if not db.dry_run:
mapping = {'A': 1, 'B': 2, 'C': 3}
for foo in orm.Foo.objects.all():
foo.new_grade = mapping[foo.grade]
foo.save()
# For the unique_together...
db.create_unique('app_foo', ['x', 'new_grade'])
運行後manage.py migrate app
,所有Foos現在都有一個帶有映射值的重複new_grade字段。在那時我承諾我的代碼,因爲它處於穩定狀態。
其次,在models.py,我刪除了舊grade
場,改名爲重複枚舉增值經銷商,又在Meta
類的引用更新爲new_grade
:
class Foo(models.Model):
A, B, C, = 1, 2, 3
grade = models.SmallIntegerField(choices=((A, 1), (B, 2), (C, 3)))
class Meta:
ordering = ['x', 'grade']
unique_together = ('x', 'grade')
我再次跑到manage.py schemamigration app --auto
並打開遷移文件修改前的方法:
def forwards(self, orm):
# For the unique_together...
db.delete_unique('app_foo', ['x', 'new_grade'])
db.delete_column('app_foo', 'grade')
db.rename_column('app_foo', 'new_grade', 'grade')
# For the unique_together...
db.create_unique('app_foo', ['x', 'grade'])
運行manage.py migrate app
後,所有的FOOS現在有自己的grade
領域取代與前者new_grade
字段和遷移完成!