Django4.0 执行查询-删除对象
通常,删除方法被命名为 delete()
。该方法立刻删除对象,并返回被删除的对象数量和一个包含了每个被删除对象类型的数量的字典。例如:
>>> e.delete()
(1, {'blog.Entry': 1})
你也能批量删除对象。所有 QuerySet
都有个 delete()
方法,它会删除 QuerySet
中的所有成员。
例如,这会删除 2005 发布的所有 Entry
对象:
>>> Entry.objects.filter(pub_date__year=2005).delete()
(5, {'webapp.Entry': 5})
请记住,只要有机会的话,这会通过纯 SQL 语句执行,所以就无需在过程中调用每个对象的删除方法了。若你为模型类提供了自定义的 delete()
方法,且希望确保调用了该方法,你需要手动删除该模型的实例(例如,如遍历 QuerySet
,在每个对象上分别调用 delete()
方法),而不是使用 QuerySet
的批量删除方法 delete()
。
当 Django 删除某个对象时,默认会模仿 SQL 约束 ON DELETE CASCADE
的行为——换而言之,某个对象被删除时,关联对象也会被删除。例子:
b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()
这种约束行为由 ForeignKey
的 on_delete
参数指定。
注意 delete()
是唯一未在 Manager
上暴漏的 QuerySet
方法。这是一种安全机制,避免你不小心调用了 Entry.objects.delete()
,删除了所有的条目。若你确实想要删除所有对象,你必须显示请求完整结果集合:
Entry.objects.all().delete()