Cómo hacer que Django QuerySet eliminar masivamente () sea más eficiente

Preparar:
Django 1.1.2, MySQL 5.1

Problema:

Blob.objects.filter(foo = foo) \ .filter(status = Blob.PLEASE_DELETE) \ .delete() 

Este fragmento SELECT * from xxx_blob where ... da como resultado que ORM genere primero un SELECT * from xxx_blob where ... consulta, luego hace un DELETE from xxx_blob where id in (BLAH); donde BLAH es una lista ridículamente larga de id. Ya que estoy eliminando una gran cantidad de manchas, esto me hace muy infeliz tanto para mí como para el DB.

¿Hay alguna razón para esto? No veo por qué el ORM no puede convertir el fragmento de código anterior en una sola consulta DELETE. ¿Hay una manera de optimizar esto sin recurrir a SQL en bruto?

No sin escribir tu propio SQL o gestores personalizados o algo así; Aunque aparentemente están trabajando en ello.

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

Para aquellos que todavía están buscando una forma eficiente de eliminación masiva en django, aquí hay una posible solución:

La razón por la que delete () puede ser tan lento es doble: 1) django tiene que garantizar que las funciones de eliminación en cascada funcionen correctamente, por lo tanto, busque referencias de clave externa a sus modelos; 2) django tiene que manejar señales pre y post guardadas para sus modelos.

Si sabe que sus modelos no tienen eliminación en cascada o señales que deben manejarse, puede acelerar este proceso recurriendo a la API privada _raw_delete de la siguiente manera:

 queryset._raw_delete(queryset.db) 

Más detalles aquí . Tenga en cuenta que django ya intenta hacer un buen manejo de estos eventos, aunque el uso de la eliminación sin formato es, en muchas situaciones, mucho más eficiente.

La eliminación masiva ya es parte de django

Tenga en cuenta que esto, siempre que sea posible, se ejecutará únicamente en SQL