Django ORM PostgreSQL DELETE 查询

4

我有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查询?是否有任何方法可以切换到它并避免列出所有ID?


你的其他模型中是否有指向你的 Room 模型的 ForeignKeys 或触发 Room 模型的信号处理程序? - Iain Shelvington
其他模型中的外键指向您的 Room 模型或触发 Room 模型的信号处理程序 - 是的,两者都是。 - Serhii Kushchenko
3
Django需要检索所有将被删除的对象,以级联删除相关对象并运行信号处理程序。你是否同意跳过此步骤,因为目前这是实现你想要的唯一内置方法? - Iain Shelvington
1个回答

1
有趣的问题。这让我深思熟虑,所以我更深入地去了解了一下。主要原因可能是使用DELETE FROM app_name_room没有处理级联删除。
不过,回答你的问题:

有没有办法切换到它并避免列出所有ID?

你可以使用私有方法_raw_delete来做到这一点。例如:
objects_to_delete = Foo.objects.all()
objects_to_delete._raw_delete(objects_to_delete.db)

这将执行以下查询:
DELETE FROM "objects_to_delete"

PS:根据函数的文档字符串

在单个直接SQL查询中删除从给定查询集找到的对象。不发送信号,也没有级联保护。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接