django内置管理员操作删除 - 性能不佳的原因?

时间:2017-03-02 10:18:46

标签: python django database

我一直在djago-view中将txt中的项添加到我的数据库中 - 有和没有@transaction.atomic - 装饰器,即带有db-writes循环或一个db-write - 性能差异接近无限!^^

现在我的观察:管理面板中的默认删除操作显然会在db-wirtes上进行(劣质)循环。删除1000个条目需要真正长。

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

如第一个答案中所述,在选择操作和实际删除之间有一个确认步骤。但即使在确认之后,需要几分钟(几千个条目)才能删除项目,在此期间数据库被锁定,因此在那时无法回复...

2 个答案:

答案 0 :(得分: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,]

答案 1 :(得分:1)

执行批量删除时,不会调用模型delete()方法,也不会调用最终的pre_deletepost_delete信号,因此如果您的代码依赖于您遇到问题的任何一种。因此,循环实例并单独调用其delete()方法是非常明智的选择。无需将其报告为错误(也不需要提交补丁),它实际上是一个功能;)