(最終更新月: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
【原因】データベースの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名などに置き換えて入力して下さい
全て削除しおわって、マイグレーションを実行するといかがでしょうか?
僕の事例ではここで成功していますので、皆様も同様であれば幸いです!