2011-05-06 108 views
5

你会如何加快Django Admin记录删除操作/页面?加速Django管理删除页面

我有一个模型B,外键约束到模型A.对于A中的每个记录,B中约有10k条记录绑定到A.所以当我必须使用默认的“Delete Django将花费15分钟来查询和显示B中删除的每条记录。我如何修改这个,而不是列出数千个依赖对象,它只显示被删除的依赖对象的计数?

回答

8

像往常一样浏览Django的源代码找到你的答案(这是令人惊讶的变量,函数,类和逻辑命名的文件可读)。

纵观django/contrib/admin/templates/admin/delete_confirmation.html(在Django 1.2.5),你会看到有24号线模板包含:

<ul>{{ deleted_objects|unordered_list }}</ul> 

如果更改了此说

<p>{{ deleted_objects|count }} objects</p> 

{% if 100 < deleted_objects|count %} 
    <p>{{ deleted_objects|count }} objects</p> 
{% else %} 
    <ul>{{ deleted_objects|unordered_list }}</ul> 
{% endif %} 

它只会显示被删除对象的数量(如果有很多被删除的对象) 。

您可能还想尝试编辑django/contrib/admin/templates/admin/actions.py以使用SQL事务更快速地执行批量删除。请参阅:http://docs.djangoproject.com/en/dev/topics/db/transactions/

基本上,action.py目前通过形成适当的查询集,直接调用delete()查询集,但不将它分组到单个数据库事务中。对示例sqlite数据库进行简单的时间测试我发现使用qs.delete()删除〜150个没有事务的对象需要11.3秒,使用for obj in qs: obj.delete()需要13.4秒。使用交易(@transaction.commit_on_success之前的删除功能),相同的命令只需要0.35秒和0.39秒(约快30倍)。授予使用事务可能会暂时锁定数据库,这可能不是一个可接受的选项。

要合理地扩展django管理员(通常您不希望直接编辑源代码;特别是如果其他用户使用相同的文件,或者您以后可能想要恢复或在其他django站点上运行其他django站点同一台机器),请参阅: http://www.djangobook.com/en/1.0/chapter17/#cn35

+0

这将帮助 - 但其他大挂机是在调用get_deleted_objects制成的django.contrib.admin.actions.py(线34在django 1.4中)。这里编译完整的对象层次结构以供稍后显示在模板中。这是我的代码至少挂起的地方。希望这也有帮助。 – Rob 2013-03-28 20:51:38

0

Django的1.4 @ drjimbob的配方略有不同:

更新文件:

django/contrib/admin/templates/admin/delete_selected_confirmation.html 

和在线35取代

{% for deletable_object in deletable_objects %} 
    <ul>{{ deletable_object|unordered_list }}</ul> 
{% endfor %} 

{% for deletable_object in deletable_objects %} 
    {% if 100 < deletable_object|length %} 
     <p>{{ deletable_object|length }} objects</p> 
    {% else %} 
     <ul>{{ deletable_object|unordered_list }}</ul> 
    {% endif %} 
{% endfor %}