Django ORM PostgreSQL DELETE запрос

У меня есть 30 экземпляров объектов Room, т.е. 30 строк в таблице базы данных.

В коде Python у меня Room.objects.all().delete().

Я вижу, что Django ORM перевел его в следующий запрос PostgreSQL: DELETE FROM "app_name_room" WHERE "app_name_room"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30).

Почему в Django ORM не используется более простой запрос DELETE FROM app_name_room? Есть ли способ перейти на него и избежать перечисления всех идентификаторов?

Интересный вопрос. Он заставил меня задуматься, поэтому я немного углубился. Основной причиной может быть то, что использование DELETE FROM app_name_room не заботится о CASCADE delete

Однако, отвечая на ваш вопрос

Есть ли способ переключиться на него и избежать перечисления всех идентификаторов?

Вы можете сделать это с помощью частного метода _raw_delete. Например:

objects_to_delete = Foo.objects.all()
objects_to_delete._raw_delete(objects_to_delete.db)

В результате будет выполнен следующий запрос:

DELETE FROM "objects_to_delete"

PS: Согласно документу function docstring:

Удаление объектов, найденных из заданного набора запросов, в одном прямом SQL-запросе. Сигналы не посылаются, защита от каскадов отсутствует.

Вернуться на верх