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-запросе. Сигналы не посылаются, защита от каскадов отсутствует.