覆盖与扩展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也是一个很好的论据无需担心:)很高兴能提供帮助