Quelle est la différence entre l'exécution de deux commandes:
foo = FooModel()
et
bar = BarModel.objects.create()
Le second crée-t-il immédiatement un BarModel
dans la base de données, alors que pour FooModel
, la save()
méthode doit être appelée explicitement pour l'ajouter à la base de données?
Réponses:
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
la source
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:
Et vous créez un premier objet:
Ensuite, vous essayez de créer un objet avec la même clé primaire:
la source
.create()
crée donc un objet même si un champ obligatoire (null=False
) est manquant?create
CharField
même s'il est défini surnull=False
ne soulèvera pas d'erreur s'il n'est pas fourni: cela est dû au fait que Django définit les chaînes par défaut sur une chaîne vide,""
donc ce n'est pas techniquementnull
obj = MyModel()
, alorsobj.full_clean()
pour l'instant.MISE À JOUR 15.3.2017:
J'ai ouvert un problème Django à ce sujet et il semble être accepté au préalable ici: https://code.djangoproject.com/ticket/27825
D'après mon expérience, lors de l'utilisation de la classe
Constructor
(ORM
) par des références avec Django,1.10.5
il peut y avoir des incohérences dans les données (c'est-à-dire que les attributs de l'objet créé peuvent obtenir le type des données d'entrée au lieu du type casté de la propriété d'objet ORM) exemple :models
some_test.py
-object.create
some_test.py
-Constructor()
la source