Home > other >  Django ORM PostgreSQL DELETE query
Django ORM PostgreSQL DELETE query

Time:06-09

I have 30 instances of the Room objects, i.e. 30 rows in the database table.

In Python code I have Room.objects.all().delete().

I see that Django ORM translated it into the following PostgreSQL query: 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).

Why doesn't the Django ORM use a more parsimonious DELETE FROM app_name_room query? Is there any way to switch to it and avoid listing all IDs?

CodePudding user response:

Interesting question. It got me thinking so I went a little deeper. The main reason could be that using DELETE FROM app_name_room doesn't take care of CASCADE delete

However, answering your question

Is there any way to switch to it and avoid listing all IDs?

You can do this using the private method _raw_delete. For instance:

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

This will execute the following query:

DELETE FROM "objects_to_delete"

PS: According to the function docstring:

Delete objects found from the given queryset in single direct SQL query. No signals are sent and there is no protection for cascades.

  • Related