Estoy tratando de usar get_or_create para algunos campos en mis formularios, pero obtengo un error 500 cuando intento hacerlo.
Una de las líneas se ve así:
customer.source = Source.objects.get_or_create(name="Website")
El error que obtengo para el código anterior es:
Cannot assign "(<Source: Website>, False)": "Customer.source"
must be a "Source" instance.
save()
es redundante?create()
crear un objeto y guardarlo todo en un solo paso y no necesita ningunosave()
get_or_create
devuelve una tuplafuente
customer.source = Source.objects.get_or_create(name="Website")[0]
customer.source, _ = Source.objects.get_or_create(name="Website")
, ya que hace que el hecho de que se devuelva una tupla sea más obvio, lo que ayuda a evitar futuros errores.get_or_create()
devuelve una tupla:created
→ tiene un valor booleano, se crea o no.customer.source
→ tiene un objeto deget_or_create()
método.fuente
Siguiendo la respuesta de @Tobu y el comentario de @mipadi, de una manera más pitónica, si no estoy interesado en la bandera creada, usaría:
fuente
El problema que está encontrando es una característica documentada de
get_or_create
.Cuando se utilizan argumentos de palabras clave distintos de "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.podría usar
customer.source = Source.objects.get_or_create(name="Website")[0]
para obtener el valor correcto.Aquí hay un enlace para la documentación: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs
fuente