Django

Django のマイグレーションエラー

Django のマイクレーションをしたときに出たエラーの対処方法をまとめました。

マイグレーションファイルを探す

何はともあれ、エラーを出したマイグレーションファイルを探します。マイグレーションを実行すると、次のような出力が表示されています。

$ python manage.py migrate
Operations to perform:
  Apply all migrations: ...
Running migrations:
  Applying XXX.000Y_ZZZZZ...Traceback (most recent call last):
...

アプリケーション名 (XXX) とマイグレーションのファイル名 (000Y_ZZZZZ) は Running migrations: の次の行に表示されているので、該当のマイグレーションファイルは該当のアプリケーションディレクトリー内の migrations ディレクトリーにあることが分かります。

ValueError: Cannot alter field XXX into YYY

Cannot alter field XXX into YYY – they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)

モデルで ManyToManyField を使用した時にこのエラーが出ました。対処方法は、マイグレーションファイルを開いて migrations.AlterField 関数を探します。

...
class Migration(migrations.Migration):
...
    operations = [
...
        migrations.AlterField(
            model_name='...',
            name='...',
            field=models.ManyToManyField(...)
        ),
....

この migrations.AlterField 関数を、次のように migrations.RemoveField 関数と migrations.AddField 関数に分割します。

...
class Migration(migrations.Migration):
...
    operations = [
...
        migrations.RemoveField(
            model_name='...',
            name='...',
        ),
        migrations.AddField(
            model_name='...',
            name='...',
            field=models.ManyToManyField(...)
        ),
....

上書き保存したら、もう一度マイグレーションを実行します。

$ python manage.py migrate

django.db.utils.OperationalError: (1050, “Table ‘XXX’ already exists”)

XXX テーブルがすでに作られてしまっているので、データベースから XXX テーブルを削除します。