Es war etwa 10 Minuten lang eingeklemmt.
Selbst wenn Sie googeln, können Sie keine Lösung finden, und möglicherweise haben Sie ein ähnliches Problem.
Ich benutze Django und PostgreSQL.
Ich habe die in Django standardmäßig erstellte Tabelle auth_user verwendet, aber ich habe eine neue Tabelle QiitaUser erstellt, die die Tabelle auth_user erweitert, und jetzt verwende ich QiitaUser (der Tabellenname ist vorläufig).
以前の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'
Ändern Sie models und settings.py wie oben, führen Sie die Migration aus und bestätigen Sie, dass die Qiitauser-Tabelle erstellt wurde.
Die Engineer-Tabelle, die ursprünglich auf die Benutzer-ID von auth_user verwies, bezieht sich jetzt auf die ID der Qiitauser-Tabelle als externen Schlüssel (sie wurde erkannt).
Wenn ich versuche, Engineer-Daten durch Angabe der ID von QiitaUser zu registrieren ...
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".
Wenn Sie eine ID angeben, die in der QiitaUser-Tabelle als Benutzer-ID des Ingenieurs vorhanden ist, tritt ein Fehler auf, wenn in der Tabelle auth_user kein Datensatz für diese ID vorhanden ist.
Ich möchte, dass Sie auf die ID von QiitaUser verweisen, aber ich habe auf die ID von auth_user verwiesen.
In meiner Entwicklungsumgebung habe ich mit der bereits angehängten externen Schlüsselbeschränkung für auth_user eine neue erweiterte Tabelle von auth_user definiert und auf AUTH_USER_MODEL = QiitaUser verwiesen, sodass die externe Schlüsselbeschränkung auth_user und QiitaUser lautet. Es scheint, dass beide angehängt wurden und ein Fehler aufgetreten ist, als versucht wurde, auf auth_user zu verweisen.
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 können Sie die Tabellendefinition mit \ d <Tabellenname>;
überprüfen.
Die externe Schlüsseleinschränkung, die auf die ID von auth_user verweist, wird nicht mehr benötigt und sollte entfernt werden.
db=# ALTER TABLE engineer DROP CONSTRAINT IF EXISTS engineer_user_id_xxxxxxxx_fk_auth_user_id;
ALTER TABLE
Wenn ich versuche, die Engineer-Daten erneut zu registrieren ...
db=# update engineer set user_id = 10 where id = 15;
UPDATE 1
Es war ein Erfolg.
Wenn Sie keinen Engineer definiert haben, der auf auth_user verweist, und ihn migrieren, sondern ein Modell verwenden, das auth_user zum Zeitpunkt der erstmaligen Migration nach dem Erstellen eines Engineer erweitert, ist das Problem meines Erachtens nicht aufgetreten.
Seien Sie vorsichtig, wenn Sie einen neuen CustomUser definieren und verwenden, während Sie bereits auth_user verwenden.
Recommended Posts