[PYTHON] ForeignKey ist für CustomUser definiert, der in AUTH_USER_MODEL in Django angegeben ist, aber nicht referenziert wird.

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.

Annahme

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).

Verstopft

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.

Ursache und Lösung

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

ForeignKey ist für CustomUser definiert, der in AUTH_USER_MODEL in Django angegeben ist, aber nicht referenziert wird.
NameError: Der globale Name'dot_parser 'ist nicht definiert und was ist zu tun, wenn er in Python angezeigt wird?
Ich möchte eine Datei, die keine bestimmte Zeichenfolge ist, als logrotate Ziel angeben, aber ist es unmöglich?
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
Ich habe eine KI gemacht, um zu beurteilen, ob es Alkohol ist oder nicht!
django geodjango Ich habe mich darauf bezogen, als ich im Tutorial feststeckte (Bearbeitung)
Ich möchte Datetime.now in Djangos Test reparieren
[Django] Fehler, wenn SlugField in .filter () angegeben ist
"Amazon Dash Button" ist in Japan gelandet, aber ich habe es gewagt, es selbst zu machen
Ich möchte in der Django-Verschiebungstabelle scrollen, aber ...
Ich möchte widerlegen "Das ist in Ruby nicht cool"
Wie man Decorator in Django benutzt und wie man es macht
Python: Kann in Lambda wiederholt werden
Ich habe Schwarz in vscode eingeführt, aber es wird nicht automatisch formatiert
Was tun, wenn ein nicht in pom.xml definiertes Glas zu einem fehlenden Artefakt wird?
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht
[Python] Der Status jeder Präfektur des neuen Koronavirus wird nur als PDF veröffentlicht, aber ich habe versucht, ihn zu kratzen, ohne ihn herunterzuladen.