【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".

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

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

【バージョン情報】

  • OS: Ubuntu 20.10
  • Python: 3.8.10
  • Django: 3.1.4
  • PostgreSQL: 12.7
  • React: 17.0.1

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

【原因】データベースの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名などに置き換えて入力して下さい

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

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

タイトルとURLをコピーしました