设定:
Django 1.1.2,MySQL 5.1
问题:
Blob.objects.filter(foo = foo) \
.filter(status = Blob.PLEASE_DELETE) \
.delete()
此代码段导致ORM首先生成SELECT * from xxx_blob where ...
查询,然后执行DELETE from xxx_blob where id in (BLAH);
,其中BLAH是一个非常长的ID列表。由于我删除了大量的blob,这使得我和DB都非常不满意。
这有什么理由吗?我不明白为什么ORM无法将上面的代码段转换为单个DELETE查询。有没有办法在不诉诸原始SQL的情况下对其进行优化?
答案 0 :(得分:18)
对于那些仍在寻找有效批量删除django的人来说,这里有一个可能的解决方案:
delete()可能很慢的原因有两个:1)django必须确保级联删除功能正常,从而寻找模型的外键引用; 2)django必须处理模型的前后保存信号。
如果您知道您的模型没有级联删除或要处理的信号,您可以通过使用私有API _raw_delete来加速此过程,如下所示:
queryset._raw_delete(queryset.db)
here中的更多详情。请注意,django已经尝试很好地处理这些事件,但在许多情况下使用raw delete会更有效率。
答案 1 :(得分:14)
不是没有编写自己的自定义SQL或经理或其他东西;他们显然正在研究它。
答案 2 :(得分:6)
Bulk delete已经是django的一部分
请记住,只要有可能,这将完全在SQL中执行