Django Model.objects.all().delete() 未完成

Posted

技术标签:

【中文标题】Django Model.objects.all().delete() 未完成【英文标题】:Django Model.objects.all().delete() not completing 【发布时间】:2013-12-31 14:16:15 【问题描述】:

我有一个 django 应用程序,它删除数据库中的所有条目,然后进入另一个集合。我遇到Model.objects.all().delete() 将对象留在数据库中的问题(每次都相同的条目)。

我已使用此代码修复它:

db_events = Event.objects.all()
while db_events.count():
    db_events.delete()

显然这不是一个很好的解决方案。发生了什么,我该如何解决?

【问题讨论】:

【参考方案1】:

我发现删除对于大型查询集效果不佳。它似乎为每个对象/行生成单独的删除。在一个我不得不删除数百万行的情况下,它会在完成之前超时。由于它总是在同一点超时,因此将保留相同的行。答案是编写原始 sql。类似的东西

Event.objects.raw('DELETE FROM myapp_event')

我不确定这是发生在你身上的事情。但这是一种可能的选择。提供的 SQL 对 Postgresql 和 mysql 有效。其他人可能会有所不同。请查阅您的文档。此外,大多数数据库都有一个更快的 TRUNCATE 命令。它看起来像:

Event.objects.raw('TRUNCATE myapp_event')   

您必须查找您的表名。 通常它们将是 <django_app_name>_<model_name> 小写。请注意 django 应用程序名称不是整个应用程序名称。这是子应用程序。

【讨论】:

以上是关于Django Model.objects.all().delete() 未完成的主要内容,如果未能解决你的问题,请参考以下文章

Django - 来自模板标签的详细名称

django model 条件过滤 queryset.filter(**condtions) 用法

Django 2021年最新版教程21数据库查询 model 多条数据 queryse转dict字典 返回渲染到前端

Django 正在为 Postgres 生成无效的 SQL

Django - 限制查询结果

Django 2.0 与 Django1.0在内部方法上的差异