如何使用Django的ORM截断表?

70 投票
9 回答
60834 浏览
提问于 2025-04-15 23:39

要清空一个数据库表,我使用这个SQL查询:

TRUNCATE TABLE `books`

我该如何使用Django的模型和ORM来清空一个表呢?

我试过这个方法,但没有成功:

Book.objects.truncate()

9 个回答

32

你可以使用模型的 _meta 属性来填写数据库表的名称:

from django.db import connection
cursor = connection.cursor()
cursor.execute('TRUNCATE TABLE "{0}"'.format(MyModel._meta.db_table))

重要提示:这对继承的模型不适用,因为它们涉及多个表!

44

你可以用一种快速又轻便的方法来实现这个,但不要使用Django的ORM(对象关系映射)。你可以通过Django的连接游标直接执行原始的SQL语句:

from django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE `books`")
95

用ORM(对象关系映射)你能做到的最接近的删除操作就是 Book.objects.all().delete()

不过,这里有些区别:使用truncate(截断)可能会更快,但ORM会去处理外键的引用,连带着删除其他表里的相关对象。

撰写回答