2017-03-02 36 views
0

我一直在djago視圖中添加項目從一個txt到我的數據庫 - 有和沒有@transaction.atomic -decorator,即與db-writes或db-write的循環 - 性能差異接近無限!^^django內置管理員操作刪除 - 性能不佳的原因?

現在我的觀察:管理面板中的默認刪除操作明顯會對db-wirtes進行(低級)循環。這需要真的長爲刪除1000個條目。

這是爲什麼,有沒有一個原因,我錯過了什麼? 或者我應該解決這個問題,並打開拉請求;)(將是我的第一個oss貢獻:))

正如在第一個答案中提到的,有一個確認步驟之間選擇行動和實際刪除。但即使在確認之後,需要幾分鐘時間(對於數千條)來刪除項目,在此期間數據庫被鎖定,因此在這一點上沒有任何回頭...

回答

1

當進行批量刪除,無論是車型delete()方法,也不是最終pre_deletepost_delete信號被調用,所以如果你的代碼依賴於任何那些你有麻煩的。因此非常明智的選擇是循環遍歷實例並分別調用它們的delete()方法。沒有必要報告它作爲一個錯誤(也不提交補丁),它實際上是一個功能;)

+0

聽起來很合理:) – Ilja

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,] 
+0

感謝您對定義自己的管理操作的意見。至於內置的一個:我看到你對確認的觀點,但這不是主要的延誤。即使在最終確認後(查詢集仍然可以訪問呢?)它會循環... – Ilja

+0

還有更多的不僅僅是要求確認,請參閱我的答案。 –