Django

【Django(エラー処理)】insert or update on table “django_admin_log” violates foreign key constraint….

(最終更新月:2021年7月)

DjangoでWebアプリ作成途中、カスタムユーザーモデルへの変更をしたところ、こんなエラーが、、、

IntegrityError at /admin/accounts/user/add/
insert or update on table "django_admin_log" violates foreign key constraint "django_admin_log_user_id_c564eba6_fk_auth_user_id" DETAIL:  Key (user_id)=(1) is not present in table "auth_user".

このエラーがでたときはカスタムユーザーモデルへの変更を諦めていました

ただ色々と試行錯誤している中で解決策が見つかりましたので、共有します!

【原因】データベースのForeignKey制約にあり

カスタムユーザーモデルの設定では、自身で作成したユーザーモデルをsettingsファイルのAUTH_USER_MODELへ指定しています

(カスタムユーザーモデルについてはこちら↓)

デフォルトのユーザーモデルからカスタムへ変更した際に、ログインなどは問題なくできるものの、データの新規追加でエラーが発生してしまいました

どうやら原因は、

ForeinKeyを設定したテーブルが変更後もデフォルトのユーザーテーブル(auth_userテーブル)と紐付られているために起こっているようです

つまり、データベース内のForeginKeyに関する「constraints(制約)」を削除する必要があることがわかりました

下記にて、削除方法(解決策)をお伝えします

【解決方法】データベース内のconstraintを削除する

データベースへアクセス

$ psql -U <ユーザー名> -d <データベース名>

パスワードを入力して、データベースへアクセスしてください

<データベース名>=#

となれば成功です!

auth_userテーブルのconstraintsをチェック

\d auth_user

色々と出てきますが、↓こんな箇所を探してください!

....
    TABLE "account_emailaddress" CONSTRAINT "account_emailaddress_user_id_2c513194_fk_auth_user_id" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
....

複数ある場合もあります

  • TABLEの後の「account_emailaddress」がテーブル名、
  • CONSTRAINTの後の「account_emailaddress_user_id……

constraintを特定する名称?になります

下記の通りこの二つを抜き出しConstraintを削除していきます

CONSTRAINTの削除

psql内で、

ALTER TABLE account_emailaddress DROP CONSTRAINT IF EXISTS account_emailaddress_user_id_2c513194_fk_auth_user_id;

と、constraintを削除(Drop)するコマンドを入力しましょう!

constraintが複数の場合は一つ一つ全て入力します

緑字赤字の箇所を適切なconstraints名などに置き換えて入力して下さい

全て削除しおわって、マイグレーションを実行するといかがでしょうか?

僕の事例ではここで成功していますので、皆様も同様であれば幸いです!