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
Python==3.7.4 Django=2.2.3
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)
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
# )
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