へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)! #vZkt8fc6J

Djangoで、RunPythonをマイグレーションファイルに忍び込ませた際の罠 django.db.utils.OperationalError: (1054, "Unknown column 'x_field' in 'field list'")

Migrationクラスに次の文を追加したとする

    operations = [
        migrations.RunPython(call_change_alpha_model),
        migrations.AddField(
            model_name='alpha',
            name='x_field',
            field=models.PositiveIntegerField(default=0),
        ),
    ]

call_change_alpha_modelは以下のような感じ

from django.core.management import call_command

def call_change_alpha_model(apps, schema_editor):
    call_command('change_alpha_model')

こうすると、RunPythonの途中に、x_fieldがないよ!と言われる。

RunPythonのときに、どうやらDjangoがモデルの中のソースをチェックしてるっぽくて、死亡するらしい。

RunPythonするお
→おっと!なんだこのフィールドは!しらないぞ!
→エラー

みたいな。

これは、べつのマイグレーションファイルに書いてもとうぜん怒られる
順序が大事なのである。
なので、たとえばRunPythonを含んでいる大きなマイグレーションファイルをスカッシュ(1つのファイルにまとめたとき)したときなどは、
マイグレートでだいたい失敗する。

基本的にこのようにすれば直る。

    operations = [
        migrations.AddField(
            model_name='alpha',
            name='x_field',
            field=models.PositiveIntegerField(default=0),
        ),
        migrations.RunPython(call_change_alpha_model),
    ]

こんなことに時間をかけるなんてつらい