J'essaie d'utiliser get_or_create pour certains champs de mes formulaires, mais j'obtiens une erreur 500 lorsque j'essaie de le faire.
L'une des lignes ressemble à ceci:
customer.source = Source.objects.get_or_create(name="Website")
L'erreur que j'obtiens pour le code ci-dessus est:
Cannot assign "(<Source: Website>, False)": "Customer.source"
must be a "Source" instance.
save()
est redondant?create()
, créer un objet et tout sauvegarder en une seule étape et n'en a pas besoinsave()
get_or_create
renvoie un tuple.la source
customer.source = Source.objects.get_or_create(name="Website")[0]
customer.source, _ = Source.objects.get_or_create(name="Website")
, car cela rend le fait qu'un tuple a été retourné plus évident, ce qui permet d'éviter de futurs bugs.get_or_create()
renvoie un tuple:created
→ a une valeur booléenne, est créé ou non.customer.source
→ a un objet deget_or_create()
méthode.la source
Après la réponse @Tobu et le commentaire @mipadi, d'une manière plus pythonique, si le drapeau créé ne m'intéresse pas, j'utiliserais:
la source
Le problème que vous rencontrez est une caractéristique documentée de
get_or_create
.Lorsque vous utilisez des arguments de mot-clé autres que "par défaut", la valeur de retour de
get_or_create
est une instance. C'est pourquoi il vous montre les parens dans la valeur de retour.vous pouvez utiliser
customer.source = Source.objects.get_or_create(name="Website")[0]
pour obtenir la valeur correcte.Voici un lien pour la documentation: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs
la source