Estou tentando usar get_or_create para alguns campos nos meus formulários, mas estou recebendo um erro 500 quando tento fazer isso.
Uma das linhas é assim:
customer.source = Source.objects.get_or_create(name="Website")
O erro que recebo para o código acima é:
Cannot assign "(<Source: Website>, False)": "Customer.source"
must be a "Source" instance.
save()
é redundante?create()
criar um objeto e salvar tudo em uma única etapa e não precisa de nenhumsave()
get_or_create
retorna uma tupla.fonte
customer.source = Source.objects.get_or_create(name="Website")[0]
customer.source, _ = Source.objects.get_or_create(name="Website")
, pois torna o fato de que uma tupla foi retornada mais óbvia, ajudando a evitar futuros erros.get_or_create()
retorna uma tupla:created
→ tem um valor booleano, é criado ou não.customer.source
→ tem um objeto deget_or_create()
método.fonte
Seguindo a resposta @Tobu e o comentário @mipadi, de uma maneira mais pitônica, se não estiver interessado na bandeira criada, eu usaria:
fonte
O problema que você está enfrentando é um recurso documentado
get_or_create
.Ao usar argumentos de palavra-chave que não sejam "padrões", o valor de retorno
get_or_create
é uma instância. É por isso que está mostrando os parênteses no valor de retorno.você pode usar
customer.source = Source.objects.get_or_create(name="Website")[0]
para obter o valor correto.Aqui está um link para a documentação: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs
fonte