Eu quero criar um objeto modelo, como Pessoa, se o id da pessoa não existir, ou vou pegar esse objeto pessoa.
O código para criar uma nova pessoa da seguinte forma:
class Person(models.Model):
identifier = models.CharField(max_length = 10)
name = models.CharField(max_length = 20)
objects = PersonManager()
class PersonManager(models.Manager):
def create_person(self, identifier):
person = self.create(identifier = identifier)
return person
Mas não sei onde verificar e obter o objeto de pessoa existente.
python
django
django-models
user1687717
fonte
fonte
QuerySet
temupdate_or_create
Não está claro se sua pergunta é sobre o método get_or_create (disponível pelo menos no Django 1.3) ou o método update_or_create (novo no Django 1.7). Depende de como você deseja atualizar o objeto de usuário.
O uso da amostra é o seguinte:
fonte
update_or_create
porque, para esse caso de uso, é melhor do queget_or_create
apenas chamarsave()
o objeto novamente.Person.objects.get_or_create(a=a, b=b, c=c, defaults={"name": name})
defaults
argumento para essas funções é onde você especifica quais campos deseja adicionar ao modelo. Não tem nada a ver com os padrões especificados nos campos do seu modeloDjango tem suporte para isso, verifique get_or_create
fonte
Para apenas uma pequena quantidade de objetos, update_or_create funciona bem, mas se você estiver fazendo sobre uma grande coleção, ele não escalará bem. update_or_create sempre executa primeiro um SELECT e depois um UPDATE.
Na melhor das hipóteses, isso só executará a primeira consulta de atualização e apenas se corresponder a zero linhas, execute outra consulta INSERT. O que aumentará muito seu desempenho se você espera que a maioria das linhas realmente exista.
Porém, tudo se resume ao seu caso de uso. Se você está esperando principalmente inserções, talvez o comando bulk_create () possa ser uma opção.
fonte
Pensei em adicionar uma resposta, já que o título da pergunta parece que pergunta como criar ou atualizar, em vez de obter ou criar conforme descrito no corpo da pergunta.
Se você deseja criar ou atualizar um objeto, o método .save () já tem este comportamento por padrão, a partir dos documentos :
É importante notar que quando eles dizem 'se o UPDATE não atualizou nada' eles estão essencialmente se referindo ao caso em que o id que você forneceu ao objeto ainda não existe no banco de dados.
fonte
Se uma das entradas ao criar for uma chave primária, isso será o suficiente:
Ele será atualizado automaticamente se existir, pois dois dados com a mesma chave primária não são permitidos.
fonte