当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django QuerySet.delete用法及代码示例


本文介绍 django.db.models.query.QuerySet.delete 的用法。

声明

delete()

QuerySet 中的所有行执行 SQL 删除查询,并返回删除的对象数和包含每个对象类型的删除数的字典。

delete() 立即应用。您不能在已获取切片或无法再被过滤的 QuerySet 上调用 delete()

例如,要删除特定博客中的所有条目:

>>> b = Blog.objects.get(pk=1)

# Delete all the entries belonging to this Blog.
>>> Entry.objects.filter(blog=b).delete()
(4, {'blog.Entry': 2, 'blog.Entry_authors': 2})

默认情况下,Django 的 ForeignKey 模拟 SQL 约束 ON DELETE CASCADE — 换句话说,任何具有指向要删除对象的外键的对象都将与它们一起被删除。例如:

>>> blogs = Blog.objects.all()

# This will delete all Blogs and all of their Entry objects.
>>> blogs.delete()
(5, {'blog.Blog': 1, 'blog.Entry': 2, 'blog.Entry_authors': 2})

此级联行为可通过 on_delete 参数自定义到 ForeignKey

delete() 方法执行批量删除,并且不会在您的模型上调用任何 delete() 方法。但是,它会为所有已删除对象(包括级联删除)发出 pre_delete post_delete 信号。

Django 需要将对象提取到内存中以发送信号和处理级联。但是,如果没有级联也没有信号,那么 Django 可能会采用 fast-path 并删除对象而不提取到内存中。对于大型删除,这可能会显著减少内存使用量。执行查询的数量也可以减少。

ForeignKeys 设置为 on_delete DO_NOTHING 不会阻止删除 fast-path。

请注意,对象删除中生成的查询是可能更改的实现细节。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.query.QuerySet.delete。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。