2011-02-01 41 views
22

设置:
Django的1.1.2中,MySQL 5.1如何使Django的查询集批量删除()更有效

问题:

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列表。由于我删除了大量的斑点,这使得我和DB都非常不高兴。

这是有原因吗?我不明白为什么ORM无法将上述片段转换为单个DELETE查询。有没有一种方法来优化,而不诉诸原始SQL?

回答

13

不是没有编写自己的自定义SQL或管理器或东西;他们显然正在努力。

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

+0

这确实是不幸的。感谢您指点我的票。 – svintus 2011-02-06 18:48:11

+1

门票给出了你想要的理由。这并不完全没有好处。 – 2013-03-11 20:07:56

3

Bulk delete已经是Django的

+4

Queryset.delete()的行为如同OP描述的那样。 – 2012-10-24 12:41:53

9

的一部分,对于那些谁仍然在寻找一种有效的方式来批量删除Django的,这里有一个可能的解决方案:

原因删除()可能这么慢是双重的:1)django必须确保级联删除功能正确,因此寻找您的模型的外键引用; 2)django必须处理模型的保存前和保存后信号。

如果你知道你的模型没有级联删除或信号进行处理,可以诉诸私有API _raw_delete如下加快这一进程:在here

queryset._raw_delete(queryset.db) 

更多细节。请注意,django已经试图很好地处理这些事件,尽管在很多情况下使用原始删除的效率更高。