Exclusão no Django ORM

Eu encontrei algo que queria alertar outros Djangonautas. A exclusão no Django ORM (ou seja, o QuerySet.delete()método) produz o que eu consideraria um SQL patológico.

Abra um ./manage.py shelle configure o registro SQL:

>>> import logging
>>> dblog = logging.getLogger('django.db.backends')
>>> dblog.setLevel(logging.DEBUG)
>>> dblog.addHandler(logging.StreamHandler())

Importe seu modelo:

>>> from polls.models import Poll
>>> Poll.objects.all()
(0.123) SELECT "polls_poll"."id", ... FROM "polls_poll"; args=()

Você deve ver que todas as consultas são registradas no console. Agora tente excluir todos os Pollobjetos:

>>> Poll.objects.all().delete()
(0.123) SELECT "polls_poll"."id", ... FROM "polls_poll"; args=()
(0.123) DELETE FROM "polls_poll" WHERE "id" IN (1, 2, ...); args=(1, 2, ...)

O que você verá é que, para deletar registros de uma tabela, o Django primeiro seleciona cada coluna de cada registro, e então adiciona a chave primária de cada registro como um argumento para uma consulta DELETE (potencialmente) grande e lenta. Se você executar um grande número de exclusões, considere mudar para SQL bruto .