2009-12-21 10 views
125

Estoy tratando de usar get_or_create para algunos campos en mis formularios, pero obtengo un error de 500 cuando intento hacerlo.¿Manera correcta de usar get_or_create?

Una de las líneas tiene el siguiente aspecto:

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

El error que consigo por el código anterior es:

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

¿Por qué editar, Dominic? El mensaje de error fue útil. – Tobu

Respuesta

211

De la documentación 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 

Parece que necesita estar regresando en una tupla, en lugar de una sola variable, hacer como esto:

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

get_or_create devuelve una tupla.

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

O, si no le importa la bandera booleana: 'customer.source = Source.objects.get_or_create (name =" Website ") [0]' – mipadi

3

La cuestión lo que está encontrando es una función documentada de get_or_create.

Al usar argumentos de palabras clave que no sean "valores predeterminados", el valor de retorno de get_or_create es una instancia. Es por eso que le muestra los parens en el valor de retorno.

puede usar customer.source = Source.objects.get_or_create(name="Website")[0] para obtener el valor correcto.

Aquí hay un enlace a la documentación: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

2

siguiente respuesta @Tobu y comentario @mipadi, de una manera más Pythonic, si no está interesado en la bandera creada, me gustaría utilizar:

customer.source, _ = Source.objects.get_or_create(name="Website") 
Cuestiones relacionadas