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?
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()
.
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")
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