主キーをsouthに変更するには、datamigrationでsouth.db.create_primary_keyコマンドを使用できます。カスタムCharFieldpkを標準のAutoFieldに変更するには、次のようにする必要があります。
1)モデルに新しいフィールドを作成します
class MyModel(Model):
id = models.AutoField(null=True)
1.1)このモデルの他のモデルに外部キーがある場合は、これらのモデルにも新しい偽のfkフィールドを作成します(IntegerFieldを使用すると、変換されます)
class MyRelatedModel(Model):
fake_fk = models.IntegerField(null=True)
2)自動南移行を作成して移行します。
./manage.py schemamigration --auto
./manage.py migrate
3)新しいデータ移行を作成する
./manage.py datamigration <your_appname> fill_id
データ移行では、これらの新しいidフィールドとfkフィールドに数字を入力します(列挙するだけです)
for n, obj in enumerate(orm.MyModel.objects.all()):
obj.id = n
# update objects with foreign keys
obj.myrelatedmodel_set.all().update(fake_fk = n)
obj.save()
db.delete_primary_key('my_app_mymodel')
db.create_primary_key('my_app_mymodel', ['id'])
4)モデルで、新しいpkフィールドにprimary_key=Trueを設定します
id = models.AutoField(primary_key=True)
5)古い主キーフィールドを削除し(不要な場合)、自動移行を作成して移行します。
5.1)外部キーがある場合-古い外部キーフィールドも削除します(移行)
6)最後のステップ-fireignキーの関係を復元します。実際のfkフィールドを再度作成し、fake_fkフィールドを削除して、自動移行を作成します。ただし、移行しないでください(!)-作成した自動移行を変更する必要があります。新しいfkを作成してfake_fkを削除する代わりに、列の名前をfake_fkに変更します。
# in your models
class MyRelatedModel(Model):
# delete fake_fk
# fake_fk = models.InegerField(null=True)
# create real fk
mymodel = models.FoeignKey('MyModel', null=True)
# in migration
def forwards(self, orm):
# left this without change - create fk field
db.add_column('my_app_myrelatedmodel', 'mymodel',
self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name='lots', to=orm['my_app.MyModel']),keep_default=False)
# remove fk column and rename fake_fk
db.delete_column('my_app_myrelatedmodel', 'mymodel_id')
db.rename_column('my_app_myrelatedmodel', 'fake_fk', 'mymodel_id')
したがって、以前に入力されたfake_fkは、実際の関係データを含む列になり、上記のすべての手順の後で失われることはありません。