我一直在djago-view中将txt中的项添加到我的数据库中 - 有和没有@transaction.atomic
- 装饰器,即带有db-writes循环或一个db-write - 性能差异接近无限!^^
现在我的观察:管理面板中的默认删除操作显然会在db-wirtes上进行(劣质)循环。删除1000个条目需要真正长。
为什么会这样,是否有原因,我错过了什么?! 或者我应该解决这个问题并打开拉取请求;)(这将是我的第一个oss贡献:))
如第一个答案中所述,在选择操作和实际删除之间有一个确认步骤。但即使在确认之后,需要几分钟(几千个条目)才能删除项目,在此期间数据库被锁定,因此在那时无法回复...
答案 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_delete
和post_delete
信号,因此如果您的代码依赖于您遇到问题的任何一种。因此,循环实例并单独调用其delete()
方法是非常明智的选择。无需将其报告为错误(也不需要提交补丁),它实际上是一个功能;)