2017-03-02 30 views
0

我一直在djago视图中添加项目从一个txt到我的数据库 - 有和没有@transaction.atomic -decorator,即与db-writes或db-write的循环 - 性能差异接近无限!^^django内置管理员操作删除 - 性能不佳的原因?

现在我的观察:管理面板中的默认删除操作明显会对db-wirtes进行(低级)循环。这需要真的长为删除1000个条目。

这是为什么,有没有一个原因,我错过了什么? 或者我应该解决这个问题,并打开拉请求;)(将是我的第一个oss贡献:))

正如在第一个答案中提到的,有一个确认步骤之间选择行动和实际删除。但即使在确认之后,需要几分钟时间(对于数千条)来删除项目,在此期间数据库被锁定,因此在这一点上没有任何回头...

回答

1

当进行批量删除,无论是车型delete()方法,也不是最终pre_deletepost_delete信号被调用,所以如果你的代码依赖于任何那些你有麻烦的。因此非常明智的选择是循环遍历实例并分别调用它们的delete()方法。没有必要报告它作为一个错误(也不提交补丁),它实际上是一个功能;)

+0

听起来很合理:) – Ilja

1

您可以随时添加自己的使用django的queryset.delete()函数删除函数,就像批量删除查询一样。

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#delete

我想原因管理员用来删除一个循环,就是它要求您确认,并列出所有将被删除相关的对象。如果您有大量条目,则需要一些时间。 (虽然它比批量删除更安全)。

在某处创建一个动作(我使用文件actions.py)。

def fast_delete(modeladmin, request, queryset): 
    queryset.delete() 

在您的admin.py文件中导入并将其添加到您的ModelAdmin类的操作中。

from myapp.actions import fast_delete 

MyModelAdmin(admin.ModelAmdin): 
    model = MyModel 
    action = [fast_delete,] 
+0

感谢您对定义自己的管理操作的意见。至于内置的一个:我看到你对确认的观点,但这不是主要的延误。即使在最终确认后(查询集仍然可以访问呢?)它会循环... – Ilja

+0

还有更多的不仅仅是要求确认,请参阅我的答案。 –