2009-12-21 3 views
125

Je suis en train d'utiliser get_or_create pour certains champs dans mes formes, mais je me fais une erreur 500 lorsque je tente de le faire.façon correcte d'utiliser get_or_create?

L'une des lignes ressemble à ceci:

customer.source = Source.objects.get_or_create(name="Website") 

L'erreur que je reçois le code ci-dessus est:

Cannot assign "(<Source: Website>, False)": "Customer.source" 
    must be a "Source" instance. 
+6

Pourquoi l'édition, Dominic? Le message d'erreur était utile. – Tobu

Répondre

211

De la documentation get_or_create:

# get_or_create() a person with similar first names. 
>>> p, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)}) 

# get_or_create() didn't have to create an object. 
>>> created 
False 

Il semble que vous avez besoin d'être de retour dans un tuple, au lieu d'une seule variable, comme cela:

customer.source,created = Source.objects.get_or_create(name="Website") 
24

get_or_create retourne un tuple.

customer.source, created = Source.objects.get_or_create(name="Website") 
+12

Ou, si vous ne se soucient pas de l'indicateur booléen: 'customer.source = Source.objects.get_or_create (name = "Site") [0]' – mipadi

3

La question vous rencontrez est une fonctionnalité documentée de get_or_create.

Lorsque vous utilisez des arguments de mots clés 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

2

Après réponse @Tobu et commentaires @mipadi, d'une manière plus pythonique, sinon intéressé par le drapeau créé, j'utiliser:

customer.source, _ = Source.objects.get_or_create(name="Website") 
Questions connexes