Django .all() 之后的 .delete() 方法

Spa*_*man 6 django django-orm

想象一下 2 行:

Model.objects.all().delete()
Run Code Online (Sandbox Code Playgroud)

Model.objects.delete()
Run Code Online (Sandbox Code Playgroud)

执行流程有什么区别吗?数据库服务器是Mysql(Amazon RDBMS)。

第一行是不是先加载所有的对象,然后一个一个的删除呢?或者将执行“截断”命令?

而且,最重要的是- 如果第一行在执行过程中由于某些原因被中断怎么办?例如,我们有一个包含很多记录的大表。如果我们执行第一行并且脚本将被终止 - 这是否意味着某些记录将被删除,而某些记录将被删除?

谢谢你!

Roh*_*han 8

别以为有Model.objects.delete()方法。来自文档

请注意,这delete()是唯一QuerySet未在管理器本身上公开的方法。这是一种安全机制,可防止您意外请求Entry.objects.delete()并删除所有条目。如果您确实想删除所有对象,则必须显式请求完整的查询集: Entry.objects.all().delete()

另外,文档中提到,django 尝试将其作为 SQL 语句,因此在删除之前它可能不会获取单个记录(此外,.delete()如果模型中的方法被覆盖,则可能不会调用模型的方法)。


dbn*_*dbn 0

查询集文档中所述,delete():

对 QuerySet 中的所有行执行 SQL 删除查询。

由于查询集在使用时才被解析,因此对象不会被一一删除,并且它们各自的删除方法永远不会被使用。