Was ist der Unterschied zwischen der Ausführung von zwei Befehlen:
foo = FooModel()
und
bar = BarModel.objects.create()
Erstellt die zweite sofort eine BarModel
in der Datenbank, während für FooModel
die save()
Methode explizit aufgerufen werden muss, um sie der Datenbank hinzuzufügen?
Antworten:
https://docs.djangoproject.com/de/stable/topics/db/queries/#creating-objects
quelle
Die beiden Syntaxen sind nicht gleichwertig und können zu unerwarteten Fehlern führen. Hier ist ein einfaches Beispiel, das die Unterschiede zeigt. Wenn Sie ein Modell haben:
Und Sie erstellen ein erstes Objekt:
Anschließend versuchen Sie, ein Objekt mit demselben Primärschlüssel zu erstellen:
quelle
.create()
erzeugt ein Objekt , selbst wenn ein erforderliches Feld (null=False
) fehlt? Ichcreate
CharField
selbst wenn auf gesetzt,null=False
wird kein Fehler ausgelöst, wenn nicht angegeben: Dies liegt daran, dass Django Zeichenfolgen standardmäßig auf eine leere Zeichenfolge gesetzt hat,""
so dass dies technisch nicht der Fall istnull
obj = MyModel()
, dannobj.full_clean()
für jetzt.UPDATE 15.3.2017:
Ich habe ein Django-Problem zu diesem Thema eröffnet und es scheint hier vorläufig akzeptiert zu werden: https://code.djangoproject.com/ticket/27825
Ich habe die Erfahrung gemacht, dass bei Verwendung der Klasse
Constructor
(ORM
) durch Verweise mit Django1.10.5
einige Inkonsistenzen in den Daten auftreten können (dh die Attribute des erstellten Objekts erhalten möglicherweise den Typ der Eingabedaten anstelle des gegossenen Typs der ORM-Objekteigenschaft) ::models
some_test.py
- -object.create
some_test.py
- -Constructor()
quelle