2009-11-05 108 views
1

我想對Django框架進行以下修改。Django - 邏輯刪除

我希望它爲我創建的每個模型創建一個「已刪除」字段。

我希望它被檢查爲刪除,當我從管理頁面中刪除它而不是物理刪除。

我不希望檢查這些記錄被刪除列出。

我是新來的Django,我看到我是否能夠輕鬆地做我想做的事情。我需要這個改變,因爲這是我們目前的工作方式。

到目前爲止,這些都是我所做的改變,我想了解整個Django framewok是如何工作的,但是我離得很遠,是否有任何在線文檔可以清楚地解釋內部框架零件/文件/模塊/類一起工作,每一個的具體作用等

在base.py文件中,在模型庫類,低於這個代碼,

for obj_name, obj in attrs.items(): 
new_class.add_to_class(obj_name, obj) 

我加入,

from django.db import models 
    new_class.add_to_class('deleted', models.BooleanField()) 

創建模型時,會向其添加「已刪除」字段。

在base.py文件中,保存方法,我改變了它在那裏的

self.deleted = True 
self.save() 

所以,現在檢查作爲刪除的記錄,而不是物理刪除它。

現在我想要的是那些記錄不被列出。

回答

7

我不明白你爲什麼要修改框架代碼,而不是將deleted字段放入所有模型擴展的模型基類中。儘管如此,過濾這些記錄的一個好方法是將自定義管理器添加到模型(或者如果您選擇創建一個模型類,則添加一個自定義管理器)。對此經理,請覆蓋here所述的get_query_set方法。在您重寫的方法中,添加exclude(deleted=True)篩選器。

+0

謝謝,正如我之前所說,我沒有太多的框架知識,這很可能會有一個更好的解決方案,以添加該字段的問題。所以我可以創建一個帶有刪除字段的基類,並從中擴展我的模型,但我沒有考慮到這一點,無論如何,這個想法總是以這種方式使用它,但是你是對的,如果你希望可能性更好創建基類而不是觸摸框架源代碼 – Pablo 2009-11-05 14:06:41

1
  1. 覆蓋在你的模型類的delete()方法,將已刪除的屬性有
  2. 創建一個將被刪除過濾屬性,並將其設置爲默認的(對象= MyDeletedManager)的自定義經理
4

看看Django-logicaldelete應用程序,您只需從他們提供的Model類繼承您的模型,然後您可以對它們進行邏輯刪除。

它還帶有一個adminModel,因此您也可以在那裏管理邏輯刪除的模型。

+0

我喜歡Django-logicaldelete的外觀,但是我擔心它會執行django文檔所說的不執行的操作。 http://docs.djangoproject.com/en/dev/topics/db/managers/#do-not-filter-away-any-results-in-this-type-of-manager-subclass – 2010-08-19 10:38:11