The delete method, conveniently, is named delete()
. This method immediately deletes the object and has no return value. Example:
e.delete()
You can also delete objects in bulk. Every QuerySet
has a delete()
method, which deletes all members of that QuerySet
.
For example, this deletes all Entry
objects with a pub_date
year of 2005:
Entry.objects.filter(pub_date__year=2005).delete()
Keep in mind that this will, whenever possible, be executed purely in SQL, and so the delete()
methods of individual object instances will not necessarily be called during the process. If you've provided a custom delete()
method on a model class and want to ensure that it is called, you will need to manually delete instances of that model (for example, by iterating over a QuerySet
and calling delete()
on each object individually) rather than using the bulk delete()
method of a QuerySet
.
When Django deletes an object, by default it emulates the behavior of the SQL constraint ON DELETE CASCADE
-in other words, any objects which had foreign keys pointing at the object to be deleted will be deleted along with it. For example:
b = Blog.objects.get(pk=1) # This will delete the Blog and all of its Entry objects. b.delete()
This cascade behavior is customizable via the on_delete
argument to the ForeignKey
.
Note that delete()
is the only QuerySet
method that is not exposed on a Manager
itself. This is a safety mechanism to prevent you from accidentally requesting Entry.objects.delete()
, and deleting all the entries. If you do want to delete all the objects, then you have to explicitly request a complete query set:
Entry.objects.all().delete()