web-dev-qa-db-fra.com

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

Quelle est la différence entre exécuter deux commandes:

foo = FooModel()

et

bar = BarModel.objects.create()

Le second crée-t-il immédiatement une BarModel dans la base de données, alors que pour FooModel, la méthode save() doit être appelée explicitement pour l'ajouter à la base de données?

221
0leg

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

Pour créer et enregistrer un objet en une seule étape, utilisez la méthode create().

204
madzohan

Les deux syntaxes ne sont pas équivalentes et peuvent entraîner des erreurs inattendues. Voici un exemple simple montrant les différences. Si vous avez un modèle:

from Django.db import models

class Test(models.Model):

    added = models.DateTimeField(auto_now_add=True)

Et vous créez un premier objet:

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

Ensuite, vous essayez de créer un objet avec la même clé primaire:

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

MISE À JOUR 15.3.2017:

J'ai ouvert un numéro de Django à ce sujet et cela semble être accepté à titre préliminaire ici: https://code.djangoproject.com/ticket/27825

D'après mon expérience, lors de l'utilisation de la classe Constructor (ORM) avec des références avec Django 1.10.5, il peut exister certaines incohérences dans les données (c'est-à-dire les attributs du fichier créé). l’objet peut obtenir le type des données d’entrée au lieu du type converti de la propriété d’objet ORM) exemple:

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