Django 1.6:清除一张表中的数据
Posted
技术标签:
【中文标题】Django 1.6:清除一张表中的数据【英文标题】:Django 1.6: Clear data in one table 【发布时间】:2014-08-17 07:46:15 【问题描述】:我有一个表名 UGC,想清除该表中的所有数据。我不想重置整个应用程序,这也会删除所有其他模型中的所有数据。是否可以只清除一个模型?如果有帮助,我还为我的应用程序配置了 South。
【问题讨论】:
【参考方案1】:你可以use raw SQL:
cursor.execute(“DROP TABLE UGC”)
或者你可以直接在 Django shell 中使用 ORM:
UGCModel.objects.all().delete()
这会删除数据(但不是表格),所以你必须小心:)
另一种方法(为了完整性和利用 South)是在模型声明中注释掉模型,迁移然后再放回去(假设没有模型引用它。)
HTH
【讨论】:
【参考方案2】:在管理界面中,您可以转到该模型的列表页面,然后您可以选择所有模型并使用表格顶部的Delete selected ...
操作。
请记住,无论您以何种方式删除数据,外键默认为ON DELETE CASCADE
,因此任何具有您要删除的模型的外键的模型也将被删除。管理界面将为您提供将被删除的模型的完整概述。
【讨论】:
很高兴指出级联的事情,但要小心管理员删除的操作:如果您有很多(我的意思是很多)对象,这将花费相当长的时间并不必要地消耗资源。 @Ambroise 为什么会这样?删除日志真的会占用资源吗? 我曾尝试以这种方式删除 80k 个对象:行为是遍历所有项目并为每个项目调用 model_instance.delete(),而模型管理器的方法 Model.objects.delete()是批量删除(一次全部删除)。一旦达到一千个对象,我建议不要使用此方法,否则它是一种可行且方便的方法。 @Ambroise 从 Django 1.1 开始,删除操作在查询集上调用delete()
方法。但是,它确实会遍历查询集并记录每个单独模型实例的删除。与单独删除每个对象相比,此迭代消耗的资源几乎没有,但我可以看到如果查询集那么大,它可能会给您的系统带来多大压力。
嗯,我误解了等待时间(以及偶尔的低规格服务器,关机),我的错 :) 谢谢你的解释!【参考方案3】:
今天在使用 django 2.0.2 时遇到了此类问题,因为我创建了我的模型
class Front(models.Model):
pass
并迁移了它,但是当我后来更新模型时,我无法运行
python manage.py makemigrations
因为它在说
You are trying to add a non-nullable field 'update' to front without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows
with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:
我的解决方案是什么?
-
我选择了选项 2,即退出
我注释掉了麻烦的模型/表,在我的例子中是
Front
我运行python manage.py makemigrations
删除了麻烦的表/模型
我取消注释我的模型并再次运行 python manage.py makemigrations
,它重新创建了表/模型,最后
我使用 python manage.py migrate
迁移了我的更改,一切都已解决!
注意:请注意上述指令,因为它会删除表/模型的所有引用/外键 on_delete=models.CASCADE
这是默认值!
【讨论】:
以上是关于Django 1.6:清除一张表中的数据的主要内容,如果未能解决你的问题,请参考以下文章