Como excluir um registro nos modelos do Django?

267

Eu quero excluir um registro específico. Tal como

delete from table_name where id = 1;

Como posso fazer isso em um django model?

user426795
fonte
16
Obrigado por fazer a pergunta. Às vezes RTFM leva muito mais tempo do que uma busca no Google e SO, como evidenciado pelo número de resposta os votos eo número de pontos de vista
Freedom_Ben
8
Concordo com @Freedom_Ben, mas para futuros leitores que gostam do manual f *, é o que você está procurando: docs.djangoproject.com/en/dev/topics/db/queries/…
Dinei

Respostas:

513

Existem algumas maneiras:

Para excluí-lo diretamente:

SomeModel.objects.filter(id=id).delete()

Para excluí-lo de uma instância:

instance = SomeModel.objects.get(id=id)
instance.delete()
Wolph
fonte
50
Observe que o primeiro não chamará o método .delete () do objeto, portanto, se você tiver um código de 'limpeza' nesse método, ele não será chamado. Geralmente não é um problema, mas vale a pena lembrar.
Matthew Schinckel
8
@ Matthew Schinckel: isso é verdade. Se você deseja ter um método de exclusão personalizado, deve usar o sinal pre_deleteou post_delete.
Wolph
2
Eu não sei qual é o caso após o DJango 1.4, mas isso é realmente buscar todas as PKs e excluí-las por essas PKs. Assim, por exemplo, se você excluir por um campo arbitrário, isso pode ser a maneira mais lento, em seguida, a contrapartida SQL ... :(
Vajk Hermecz
1
@VajkHermecz: isso é verdade e o comportamento esperado por causa dos sinais de exclusão. O sistema de sinais do Django precisa rastrear todas as alterações no banco de dados, porque algo pode se conectar a ele (como a reversão faz).
Wolph
3
Você pode usar o valor de retorno de delete()para verificar o que estava excluindo. Ele retorna uma tupla com a contagem de objetos excluídos e um dicionário com detalhes sobre os tipos excluídos, por exemplo (1, {'yourapp.SomeModel': 1}).
Mcb 31/07/19
37
MyModel.objects.get(pk=1).delete()

isso gerará uma exceção se o objeto com chave primária especificada não existir, porque primeiro ele tenta recuperar o objeto especificado.

MyModel.objects.filter(pk=1).delete()

isso não gerará exceção se o objeto com chave primária especificada não existir e produzir diretamente a consulta

DELETE FROM my_models where id=1
Milad Khodabandehloo
fonte
1
Erro de digitação MyModel.object.filter(pk=1).delete(). Deve ser "objetos".
Nigel
8

se você deseja excluir uma instância, escreva o código

delet= Account.objects.get(id= 5)
delet.delete()

se você quiser excluir todas as instâncias, escreva o código

delet= Account.objects.all()
delete.delete()
islamismo
fonte
7

Se você deseja excluir um item

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

Se você deseja excluir todos os itens da lista de desejos, por exemplo

Wishlist.objects.all().delete()
Ahmed Adewale
fonte
6

Wolph forneceu uma boa resposta para códigos focados. Deixe-me colar o documento oficial aqui, para referência das pessoas.

VicX
fonte