[PYTHON] So erstellen Sie einen Datensatz, indem Sie eine Beziehung zum geerbten Modell in das von Django geerbte Modell einfügen

Überblick

So erstellen Sie einen Datensatz, indem Sie eine Beziehung zum geerbten Modell in das von Django geerbte Modell einfügen

Beim Einfügen einer Beziehung zum Vererbungsquellenmodell kann das Vererbungsquellenmodell in einen unbeabsichtigten Wert geändert werden. Ich werde es einschließlich Vorsichtsmaßnahmen und Problemumgehungen schreiben!

~~ Ich war verwirrt über das Verhalten von Django ~~ Ich liebe Django

Umgebung, in der der Betrieb bestätigt wurde

Python==3.7.4 Django=2.2.3

Fazit

Geben Sie dem Feld "{Modellname} _ptr" ein Modellobjekt, das während der Modellvererbung implizit definiert wird

Wenn Sie zu diesem Zeitpunkt "Model.save ()" oder "Model.objects.create ()" ausführen, wird das geerbte Modell möglicherweise in einen unbeabsichtigten Wert geändert. Verwenden Sie daher ".save_base (raw = True)". Machen

#Modelldefinition
from django.db import models

    
class Parent(models.Model):
    parent_column = models.CharField(max_length=255)

#Modell, das ParentModel erbt
class Child(Parent):
    child_column = models.CharField(max_length=255)
    
  

parent = Parent.objects.create(
    parent_column="Text"
)
#Erstellen Sie ein Vererbungszielmodell mit einer Beziehung, die dem erstellten Vererbungsquellmodell zugeordnet ist
child = Child(
    parent_ptr=parent,
    child_column="Text"
)
child.save_base(raw=True)

Was passiert, wenn Sie Model erben?

Wenn Sie von Model erben, werden auch die Felder des vererbenden Modells geerbt.

In der Datenbank verfügt die untergeordnete Tabelle nicht über eine übergeordnete Spalte, und ein externer Schlüssel für die übergeordnete Tabelle wird erstellt

class Child(Parent):
    child_colum = models.CharField(max_length=255)

    #Geerbter Elternteil_Spalte existiert auch
    # parent_colum = models.CharField(max_length=255)

    #Implizit ist auch die Vererbungsquelle OneToOneField definiert
    # parent_ptr = models.OneToOneField(
    #     Parent,
    #     parent_link=True
    # )

[Achtung] Um das geerbte Modell nicht zu beeinflussen

Als Hinweis

Der Wert von Parent.parent_column ist leer, wenn Sie Folgendes tun:


parent = Parent.objects.create(parent_column="Text")
Child.objects.create(
    parent_ptr=parent,
    child_column="Text"
)

""Kehrt zurück
print(Parent.objects.get(pk=parent.pk).parent_column)

das ist, Tritt auf, weil "parent_link = True" im Feld "parent_ptr" von ChildModel definiert ist

Infolgedessen wird das übergeordnete Element von "parent_ptr = parent" zum Zeitpunkt der Erstellung aktualisiert. ChildModel definiert auch ein geerbtes Feld parent_column

Wenn Sie in diesem Feld einen Wert ohne Angabe eines Werts erstellen, wird dieser auf der übergeordneten Seite aktualisiert. Um es zu umgehen

Mit "Model.save_base (raw = True)" können Sie das geerbte Modell einfügen, ohne das geerbte Modell zu aktualisieren.

Recommended Posts

So erstellen Sie einen Datensatz, indem Sie eine Beziehung zum geerbten Modell in das von Django geerbte Modell einfügen
So erstellen Sie eine Rest-API in Django
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
So erstellen Sie eine JSON-Datei in Python
So identifizieren Sie die Zugriffsquelle in der generischen Klassenansicht von Django eindeutig
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
So erhalten Sie den "Namen" eines Feldes, dessen Wert durch das Auswahlattribut im Django-Modell begrenzt ist
So erhalten Sie mehrere Modellobjekte zufällig in Django
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Verwendung des in Lobe in Python erlernten Modells
So verweisen Sie auf statische Dateien in einem Django-Projekt
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Verwendung der Methode __call__ in der Python-Klasse
Eine Geschichte, die das Debuggen von Modellen in der Django + SQLAlchemy-Umgebung einfacher macht
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Erstellen Sie eine neue Liste, indem Sie doppelte Elemente in der Liste kombinieren
Wie man in Django die angezeigte lange Zeichenkette in der Mitte abkürzt ....
[Django] Was tun, wenn das zu erstellende Modell viele Felder enthält?
So geben Sie die im Django-Modell enthaltenen Daten im JSON-Format zurück und ordnen sie der Broschüre zu
[sh] Das Speichern der Befehlsausführung führt zu Variablen
So bestimmen Sie die Existenz eines Selenelements in Python
So erhalten Sie alle möglichen Werte in einem regulären Ausdruck
So überprüfen Sie die Speichergröße einer Variablen in Python
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
So stellen Sie eine Django-App in nur 5 Minuten für Heroku bereit
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Schritte zum Erstellen eines Django-Projekts
So erstellen Sie ein Conda-Paket
So erstellen Sie eine virtuelle Brücke
Wie man CSS in Django reflektiert
Wie erstelle ich eine Docker-Datei?
So erstellen Sie eine Konfigurationsdatei
Erstellen Sie mit Django einen LINE-Bot
Beachten Sie, dass Sie die im Django-Vorlagenformular übergebenen Parameter Element für Element manuell dekorieren möchten
So erstellen Sie mit YOLO in 3 Stunden ein Modell für die Objekterkennung
So geben Sie eine .ui-Datei in der Dialog- / Widget-GUI in PySide an
[NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells
Es wurde eine Funktion hinzugefügt, um gewünschte Verschiebungen in der Django-Verschiebungstabelle zu registrieren
So finden Sie den Ansichtsnamen mit dem Namespace über die URL (path_info) in Django
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
[Entwicklungsumgebung] So erstellen Sie einen Datensatz in der Nähe der Produktionsdatenbank
Erstellen Sie mit dem Python-Anforderungsmodul einen Datensatz mit Anhängen in KINTONE
So erstellen Sie einen Git-Klonordner
So überprüfen Sie die Version von Django
So löschen Sie abgelaufene Sitzungen in Django
Erstellen Sie ein Modell für Ihren Django-Zeitplan
Wie bekomme ich Stacktrace in Python?
So erstellen Sie ein Repository aus Medien
So führen Sie vom Server gesendete Ereignisse in Django durch
Implementieren Sie ein benutzerdefiniertes Benutzermodell in Django
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python