Django - 逻辑删除

时间:2009-11-05 12:09:39

标签: django django-models

我想对Django框架进行以下修改。

我希望它为我创建的每个模型创建一个“已删除”字段。

我希望在从管理页面删除它而不是在物理上删除它时将其检查为已删除。

我不希望列出已删除的这些记录。

我是Django的新手,我看到我是否可以轻松地做我想做的事情。我需要这种改变,因为这是我们目前的工作方式。

到目前为止,这些都是我所做的改变,我想了解整个Django framewok是如何在里面工作的,但是我离这个很远,有没有在线文档可以清楚地解释内部框架部分/文件/模块/类一起工作,每个模块的具体作用等等。

在base.py文件的modelbase类中,在此代码下面

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文件中,在save方法中,我更改了

的内容
self.deleted = True
self.save()

所以,现在它检查已删除的记录而不是实际删除它。

现在我想要的是那些没有列出的记录。

3 个答案:

答案 0 :(得分:7)

我不明白为什么要修改框架代码而不是将deleted字段放在所有模型扩展的模型基类中。

然而,过滤这些记录的一种好方法是将自定义管理器添加到模型(或者您的基础模型类,如果您选择创建一个)。对于此经理,请按照here所述覆盖get_query_set方法。在重写的方法中,添加exclude(deleted=True)过滤器。

答案 1 :(得分:4)

查看Django-logicaldelete应用,您只需从其提供的Model类继承模型,然后对所有模型进行逻辑删除。

它还带有一个adminModel,因此您也可以在那里管理逻辑删除的模型。

答案 2 :(得分:1)

  1. 覆盖模型类中的delete()方法,在那里设置deleted属性
  2. 创建一个自定义管理器,它将按已删除的属性进行过滤并将其设置为默认属性(objects = MyDeletedManager)