Qual a diferença entre executar dois comandos:
foo = FooModel()
e
bar = BarModel.objects.create()
O segundo cria imediatamente um BarModel
no banco de dados, enquanto que para FooModel
o save()
método deve ser chamado explicitamente para adicioná-lo ao banco de dados?
Respostas:
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
fonte
As duas sintaxes não são equivalentes e podem levar a erros inesperados. Aqui está um exemplo simples mostrando as diferenças. Se você tem um modelo:
E você cria um primeiro objeto:
Então você tenta criar um objeto com a mesma chave primária:
fonte
.create()
cria um objeto, mesmo se um campo obrigatório (null=False
) está faltando? Estou adicionando testes para meu projeto ecreate
está a ter resultados inesperadosCharField
mesmo que definido paranull=False
não gerar um erro se não for fornecido: isso é porque Django definir cordas por padrão para uma cadeia vazia""
para que ele não é tecnicamentenull
obj = MyModel()
, entãoobj.full_clean()
por enquanto.ATUALIZAÇÃO 15.3.2017:
Eu abri uma questão do Django sobre isso e parece ser preliminar aceito aqui: https://code.djangoproject.com/ticket/27825
Minha experiência é que, ao usar a classe
Constructor
(ORM
) por referências com o Django1.10.5
, pode haver algumas inconsistências nos dados (ou seja, os atributos do objeto criado podem obter o tipo dos dados de entrada em vez do tipo convertido da propriedade do objeto ORM) :models
some_test.py
-object.create
some_test.py
-Constructor()
fonte