読者です 読者をやめる 読者になる 読者になる

Django と South と カラム名変更

South でカラム名を変更したい

class Example(models.Model):
    hoge = models.TextField()

こんなモデルの hoge を huga に変えたいとします。

class Example(models.Model):
    huga = models.TextField()  # hoge → huga

こういう場合普通に schemamigration をすると South は add して delete します。

class Migration(SchemaMigration):
    def forwards(self, orm):
        # Adding field 'Example.huga'
        db.add_column('example', 'huga', self.gf('django.db.models.fields.TextField')())

        # Deleting field 'Exsample.hoge'
        db.delete_column(u'example', 'hoge')

    # backwards以下省略

自動ではカラム名を変更すべきかどうかわからないので、しょうがないですね。
hoge にデータがない場合はこのままでも良いのですが、データがある場合は delete しちゃうと困ります。
こんな時はモデルを変更した後に schemamigration じゃなくて datamigration をします。
そうすると、こんなファイルが出来るので

class Migration(SchemaMigration):
    def forwards(self, orm):
        "Write your forwards methods here."

    # backwards以下省略

db.rename_column でカラム名を変更します。

class Migration(SchemaMigration):
    def forwards(self, orm):
        db.rename_column('example', 'hoge', 'huga')

    # backwards以下省略

カラム名の変更以外にも schemamigration で上手く行かなかった場合は、datamigration で Database API を使って自前で migration を書くことを考えると良いと思います。

こんなの書いたけど
とうとう South が Django に取込まれるみたいです。
https://speakerdeck.com/andrewgodwin/migrating-the-future
なので、すぐに使えなくなる知識かもしれません。
ですが、South なしの Django とか使う気にならないので、取込まれるのが楽しみです!