你會如何加快Django Admin記錄刪除操作/頁面?加速Django管理刪除頁面
我有一個模型B,外鍵約束到模型A.對於A中的每個記錄,B中約有10k條記錄綁定到A.所以當我必須使用默認的「Delete Django將花費15分鐘來查詢和顯示B中刪除的每條記錄。我如何修改這個,而不是列出數千個依賴對象,它只顯示被刪除的依賴對象的計數?
你會如何加快Django Admin記錄刪除操作/頁面?加速Django管理刪除頁面
我有一個模型B,外鍵約束到模型A.對於A中的每個記錄,B中約有10k條記錄綁定到A.所以當我必須使用默認的「Delete Django將花費15分鐘來查詢和顯示B中刪除的每條記錄。我如何修改這個,而不是列出數千個依賴對象,它只顯示被刪除的依賴對象的計數?
像往常一樣瀏覽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
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 %}
這將幫助 - 但其他大掛機是在調用get_deleted_objects製成的django.contrib.admin.actions.py(線34在django 1.4中)。這裏編譯完整的對象層次結構以供稍後顯示在模板中。這是我的代碼至少掛起的地方。希望這也有幫助。 – Rob 2013-03-28 20:51:38