delete()
Performs an SQL delete query on all rows in the QuerySet
and returns the number of objects deleted and a dictionary with the number of deletions per object type.
The delete()
is applied instantly. You cannot call delete()
on a QuerySet
that has had a slice taken or can otherwise no longer be filtered.
For example, to delete all the entries in a particular blog:
>>> b = Blog.objects.get(pk=1) # Delete all the entries belonging to this Blog. >>> Entry.objects.filter(blog=b).delete() (4, {'weblog.Entry': 2, 'weblog.Entry_authors': 2})
The return value describing the number of objects deleted was added.
By default, Django’s ForeignKey
emulates the SQL constraint ON DELETE CASCADE
— in other words, any objects with foreign keys pointing at the objects to be deleted will be deleted along with them. For example:
>>> blogs = Blog.objects.all() # This will delete all Blogs and all of their Entry objects. >>> blogs.delete() (5, {'weblog.Blog': 1, 'weblog.Entry': 2, 'weblog.Entry_authors': 2})
This cascade behavior is customizable via the on_delete
argument to the ForeignKey
.
The delete()
method does a bulk delete and does not call any delete()
methods on your models. It does, however, emit the pre_delete
and post_delete
signals for all deleted objects (including cascaded deletions).
Django needs to fetch objects into memory to send signals and handle cascades. However, if there are no cascades and no signals, then Django may take a fast-path and delete objects without fetching into memory. For large deletes this can result in significantly reduced memory usage. The amount of executed queries can be reduced, too.
ForeignKeys which are set to on_delete
DO_NOTHING
do not prevent taking the fast-path in deletion.
Note that the queries generated in object deletion is an implementation detail subject to change.
Please login to continue.