如何使Django QuerySet批量删除()更高效

时间:2011-02-01 20:58:03

标签: python django orm

设定:
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的情况下对其进行优化?

3 个答案:

答案 0 :(得分:18)

对于那些仍在寻找有效批量删除django的人来说,这里有一个可能的解决方案:

delete()可能很慢的原因有两个:1)django必须确保级联删除功能正常,从而寻找模型的外键引用; 2)django必须处理模型的前后保存信号。

如果您知道您的模型没有级联删除或要处理的信号,您可以通过使用私有API _raw_delete来加速此过程,如下所示:

queryset._raw_delete(queryset.db)

here中的更多详情。请注意,django已经尝试很好地处理这些事件,但在许多情况下使用raw delete会更有效率。

答案 1 :(得分:14)

不是没有编写自己的自定义SQL或经理或其他东西;他们显然正在研究它。

http://code.djangoproject.com/ticket/9519

答案 2 :(得分:6)

Bulk delete已经是django的一部分

  

请记住,只要有可能,这将完全在SQL中执行