¿Cómo borrar un registro en los modelos Django?


267

Quiero borrar un registro en particular. Como

delete from table_name where id = 1;

¿Cómo puedo hacer esto en un django model?


16
Gracias por hacer la pregunta. A veces, RTFM lleva mucho más tiempo que una búsqueda en Google y SO, como lo demuestra la cantidad de votos de respuesta y la cantidad de visitas
Freedom_Ben

8
De acuerdo con @Freedom_Ben, pero para futuros lectores a los que les guste el manual f * de todos modos, esto es lo que está buscando: docs.djangoproject.com/en/dev/topics/db/queries/…
Dinei

Respuestas:


513

Hay un par de maneras:

Para eliminarlo directamente:

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

Para eliminarlo de una instancia:

instance = SomeModel.objects.get(id=id)
instance.delete()

50
Tenga en cuenta que el primero no llamará al método .delete () del objeto, por lo que si tiene un código de "limpieza" en ese método, no se llamará. Generalmente no es un problema, pero vale la pena tenerlo en cuenta.
Matthew Schinckel

8
@Matthew Schinckel: eso es cierto. Si desea tener un método de eliminación personalizado, debe usar la señal pre_deleteo en su post_deletelugar.
Wolph

2
No sé cuál es el caso después de DJango 1.4, pero esto en realidad está recuperando todas las PK y luego borrado por esas PK. Entonces, por ejemplo, si elimina por un campo arbitrario, esto puede ser mucho más lento que la contraparte SQL ... :(
Vajk Hermecz

1
@VajkHermecz: eso es cierto y el comportamiento esperado debido a las señales de eliminación. El sistema de señales Django tiene que rastrear todos los cambios en la base de datos porque algo podría engancharse a él (como lo hace la reversión).
Wolph

3
Puede usar el valor de retorno de delete()para verificar lo que estaba borrando. Devuelve una tupla con el recuento de objetos eliminados y un diccionario con detalles sobre los tipos eliminados, por ejemplo (1, {'yourapp.SomeModel': 1}).
mcb

37
MyModel.objects.get(pk=1).delete()

esto generará una excepción si el objeto con la clave primaria especificada no existe porque al principio intenta recuperar el objeto especificado.

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

esto no generará una excepción si el objeto con la clave primaria especificada no existe y produce directamente la consulta

DELETE FROM my_models where id=1

1
Typo in MyModel.object.filter(pk=1).delete(). Debería ser "objetos".
Nigel

8

si desea eliminar una instancia, escriba el código

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

si desea eliminar todas las instancias, escriba el código

delet= Account.objects.all()
delete.delete()

7

Si quieres eliminar un elemento

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

Si desea eliminar todos los elementos de la lista de deseos, por ejemplo

Wishlist.objects.all().delete()

6

Wolph proporcionó una buena respuesta centrada en los códigos. Permítanme pegar el documento oficial aquí, para referencia de la gente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.