加速Django Admin删除页面

时间:2011-05-06 21:55:03

标签: python django django-admin django-orm

您如何加快Django Admin记录删除操作/页面的速度?

我有一个带有外键约束的模型B模型A.对于A中的每个记录,B中约有10k条记录绑定到A.所以当我必须使用默认的“删除选择”删除A中的记录时“在管理员中执行操作,Django将花费15分钟来查询并显示在B中删除的每个记录。我将如何修改它,而不是列出数千个依赖对象,它只显示要删除的依赖对象的计数?” p>

2 个答案:

答案 0 :(得分: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数据库进行简单的时间测试我发现删除约150个没有事务的对象使用qs.delete()需要11.3秒,使用for obj in qs: obj.delete()需要13.4秒。在删除函数之前使用事务(@transaction.commit_on_success),相同的命令仅花费0.35秒和0.39秒(大约快30倍)。使用事务授予可能会暂时锁定数据库,这可能不是一个可接受的选项。

明智地扩展django管理员(通常你不想直接编辑源代码;特别是如果其他用户使用相同的文件,或者你可能想要稍后还原或正在运行其他django站点机器)见: http://www.djangobook.com/en/1.0/chapter17/#cn35

答案 1 :(得分: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 %}