python - related - query get django




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

Qual è la differenza tra l'esecuzione di due comandi:

foo = FooModel()

e

bar = BarModel.objects.create()

Il secondo crea immediatamente un BarModel nel database, mentre per FooModel il metodo save() deve essere chiamato esplicitamente per aggiungerlo?


AGGIORNAMENTO 15.3.2017:

Ho aperto un problema su Django e sembra essere preliminarmente accettato qui: https://code.djangoproject.com/ticket/27825

La mia esperienza è che quando si utilizza la classe Constructor ( ORM ) per riferimento con Django 1.10.5 potrebbero esserci alcune incongruenze nei dati (cioè gli attributi dell'oggetto creato potrebbero ottenere il tipo di dati di input invece del tipo casted del Esempio di proprietà ORM):

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

Le due sintassi non sono equivalenti e possono portare a errori imprevisti. Ecco un semplice esempio che mostra le differenze. Se hai un modello:

from django.db import models

class Test(models.Model):

    added = models.DateTimeField(auto_now_add=True)

E tu crei un primo oggetto:

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

Quindi provi a creare un oggetto con la stessa chiave primaria:

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




database