Django4 中文入门教程 Django4.0 执行查询-删除对象

2024-02-25 开发教程 Django4 中文入门教程 匿名 5

通常,删除方法被命名为 ​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()