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?


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()

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

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()

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()

6

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.