2011-05-06 120 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 %}