2009-11-05 109 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