It was jammed for about 10 minutes.
Even if you google, you can't find a solution, and maybe you may have a similar problem.
I'm using Django and PostgreSQL.
I used to use the auth_user table created by default in Django, but I created a new table QiitaUser that extends the auth_user table, and now I use QiitaUser (the table name is tentative).
以前のmodels.py
from django.conf import settings
from django.db import models
class Engineers(models.Model):
name = models.CharField(max_length=1000)
user = models.ForeignKey(settings.AUTH_USER_MODEL, to_field='id', on_delete=models.CASCADE, null=True)
変更後のmodels.py
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models
class Engineer(models.Model):
name = models.CharField(max_length=1000)
user = models.ForeignKey(settings.AUTH_USER_MODEL, to_field='id', on_delete=models.CASCADE, null=True)
class QiitaUser(AbstractUser):
is_owner = models.BooleanField(default=False)
settings.py
AUTH_USER_MODEL = 'QiitaUser'
Modify models and settings.py as above and execute migration to confirm that the qiitauser table is created.
The engineer table, which originally referred to the user_id of auth_user, now references the id of the qiitauser table as a foreign key (it was recognized).
When I try to register Engineer data by specifying the id of QiitaUser ...
db=# update engineer set user_id = 10 where id = 15;
ERROR: insert or update on table "engineer" violates foreign key constraint "engineer_user_id_xxxxxxxx_fk_auth_user_id"
DETAIL: Key (user_id)=(10) is not present in table "auth_user".
If the id that exists in the QiitaUser table is specified in the user_id of the Engineer, an error will occur if there is no record of that id in the auth_user table.
I want you to refer to the id of QiitaUser, but I have referred to the id of auth_user.
In my development environment, with the foreign key constraint on auth_user already attached, I defined a new extended table of auth_user and referred to AUTH_USER_MODEL = QiitaUser, so the foreign key constraint is auth_user and QiitaUser. It seems that both were attached and an error occurred when trying to refer to auth_user.
db=# \d engineer;
Table "public.engineer"
Column | Type | Collation | Nullable | Default
------------------------+-------------------------+-----------+----------+---------------------------------------------------
id | integer | | not null | nextval('engineer_id_seq'::regclass)
name | character varying(1000) | | not null |
user_id | integer | | |
Indexes:
"engineer_pkey" PRIMARY KEY, btree (id)
"engineer_user_id_xxxxxxxx" btree (user_id)
Foreign-key constraints:
"engineer_user_id_xxxxxxxx_fk_accounts_" FOREIGN KEY (user_id) REFERENCES accounts_visualuser(id) DEFERRABLE INITIALLY DEFERRED
"engineer_user_id_xxxxxxxx_fk_auth_user_id" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
In PostgreSQL, you can check the table definition with \ d <tablename>;
.
The foreign key constraint that references the id of auth_user is no longer needed and should be removed.
db=# ALTER TABLE engineer DROP CONSTRAINT IF EXISTS engineer_user_id_xxxxxxxx_fk_auth_user_id;
ALTER TABLE
When I try to register the Engineer data again ...
db=# update engineer set user_id = 10 where id = 15;
UPDATE 1
It was a success.
If you do not define an Engineer that refers to auth_user and migrate it, but use a Model that extends auth_user at the timing of migrating for the first time after creating an Engineer, I think that the problem like this did not occur.
You need to be careful when defining and using a new CustomUser while already using auth_user.
Recommended Posts