覆盖与扩展Django';s models.Manager处理删除的对象(最佳实践)

覆盖与扩展Django';s models.Manager处理删除的对象(最佳实践),django,django-models,Django,Django Models,有一个要求,即不应从数据库中删除任何内容(不应删除任何行) 因此,显然,所有模型都应该继承如下内容: class BaseModel(models.Model): is_deleted = models.BooleanField(default=False) 但是,如何制作模型并不明显。管理者处理是最好的方法 我可以想象两种选择: 1)覆盖基本模型管理器获取查询集()方法 因此,两者都将只返回活动对象(标记为is_deleted=False): 如果被删除=True,则即使.get(…

有一个要求,即不应从数据库中删除任何内容(不应删除任何行)

因此,显然,所有模型都应该继承如下内容:

class BaseModel(models.Model):
    is_deleted = models.BooleanField(default=False)
但是,如何制作
模型并不明显。管理者处理
是最好的方法

我可以想象两种选择:

1)覆盖
基本模型
管理器
获取查询集()
方法

因此,两者都将只返回活动对象(标记为
is_deleted=False
):

如果
被删除=True,则即使
.get(…)
也会引发404:

Article.objects.get(id=1)
Article.objects.deleted(id=1)
Article.actual.all()
Article.actual.filter(id__in=[1, 2])
Article.actual.get(id=1)  # 404 even if in db, but is_deleted=True
另外,使用其他方法进行扩展,以便能够实际访问
is_deleted=True

Article.objects.get(id=1)
Article.objects.deleted(id=1)
Article.actual.all()
Article.actual.filter(id__in=[1, 2])
Article.actual.get(id=1)  # 404 even if in db, but is_deleted=True
2)第二个选项是使用额外的第二个
管理器扩展
比如-
实际的

因此,所有三个都将排除
is_deleted=True
的对象:

Article.objects.get(id=1)
Article.objects.deleted(id=1)
Article.actual.all()
Article.actual.filter(id__in=[1, 2])
Article.actual.get(id=1)  # 404 even if in db, but is_deleted=True
同时,常规的
对象
以本机行为工作和站立(忽略
是否被删除
):


也许还有其他好的选择?是否有最佳实践

大thx的建议

1或2个选项? 从:

如果使用自定义管理器对象,请注意第一个管理器Django遇到的对象(按照它们在模型中定义的顺序)具有特殊状态。Django将类中定义的第一个管理器解释为“默认”管理器,Django的几个部分(包括dumpdata)将专门为该模型使用该管理器。因此,在选择默认管理器时要小心,以避免覆盖get_queryset()导致无法检索您想要使用的对象的情况

此外,您使用的任何第三方应用程序也可能使用默认管理器。问问自己,这些应用程序访问您的“已删除”行是否重要

基于上述原因,我想我可能会选择两位经理

另一个考虑 当您说“不应从数据库中删除任何内容”时,您的意思是不应删除任何行,或者不应删除任何数据。如果是后者,请记住,当您更新一行时,旧数据将永远丢失,从这个意义上讲,数据将被“删除”

为了避免这种情况,您可以使用一个只向数据库添加行的系统。您需要一个非唯一的id字段来标识您使用的行,当您获得一个特定的id时,您选择了具有该id的最近更新的行。只是想一想。

Big thx作为答案(我已经更新了问题,ye-不应该删除任何行)dumpdata也是一个很好的论据无需担心:)很高兴能提供帮助