it-swarm.com.de

Django Model () vs Model.objects.create ()

Was ist der Unterschied zwischen der Ausführung von zwei Befehlen:

foo = FooModel()

und

bar = BarModel.objects.create()

Erstellt der zweite sofort ein BarModel in der Datenbank, während für FooModel die save() -Methode explizit aufgerufen werden muss, um sie der Datenbank hinzuzufügen?

221
0leg

https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects

Verwenden Sie die Methode create(), um ein Objekt in einem Schritt zu erstellen und zu speichern.

204
madzohan

Die beiden Syntaxen sind nicht äquivalent und können zu unerwarteten Fehlern führen. Hier ist ein einfaches Beispiel, das die Unterschiede zeigt. Wenn Sie ein Modell haben:

from Django.db import models

class Test(models.Model):

    added = models.DateTimeField(auto_now_add=True)

Und Sie erstellen ein erstes Objekt:

foo = Test.objects.create(pk=1)

Dann versuchen Sie, ein Objekt mit demselben Primärschlüssel zu erstellen:

foo_duplicate = Test.objects.create(pk=1)
# returns the error:
# Django.db.utils.IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")

foo_duplicate = Test(pk=1).save()
# returns the error:
# Django.db.utils.IntegrityError: (1048, "Column 'added' cannot be null")
10
Thomas Leonard

UPDATE 15.3.2017:

Ich habe eine Django-Ausgabe dazu eröffnet und es scheint vorläufig hier akzeptiert zu sein: https://code.djangoproject.com/ticket/27825

Ich habe die Erfahrung gemacht, dass es bei Verwendung der Klasse Constructor (ORM) durch Verweise auf Django _1.10.5_ zu Inkonsistenzen in den Daten kommen kann (dh den Attributen der erstellten object kann den Typ der Eingabedaten anstelle des gegossenen Typs der ORM-Objekteigenschaft erhalten. Beispiel:

models

_class Payment(models.Model):
     amount_cash = models.DecimalField()
_

_some_test.py_ - _object.create_

_Class SomeTestCase:
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
        objs = []
        if not base_data:
            base_data = {'amount_case': 123.00}
        for modifier in modifiers:
            actual_data = deepcopy(base_data)
            actual_data.update(modifier)
            # Hacky fix,
            _obj = _constructor.objects.create(**actual_data)
            print(type(_obj.amount_cash)) # Decimal
            assert created
           objs.append(_obj)
        return objs
_

_some_test.py_ - Constructor()

_Class SomeTestCase:
    def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
        objs = []
        if not base_data:
            base_data = {'amount_case': 123.00}
        for modifier in modifiers:
            actual_data = deepcopy(base_data)
            actual_data.update(modifier)
            # Hacky fix,
            _obj = _constructor(**actual_data)
            print(type(_obj.amount_cash)) # Float
            assert created
           objs.append(_obj)
        return objs
_
8
Oleg Belousov