我正在使用以下设置在Django中实现软删除。我对Django不太熟悉,所以我很感激我对可能遇到的陷阱的任何反馈。我特别不喜欢继承QuerySet。
基本想法是,delete
上MyModel
的第一次调用会将MyModel
的{{1}}更改为当前日期时间。第二个date_deleted
实际上会删除该对象。 (捕获delete
需要两个覆盖,一个在对象上,另一个在delete
上,可以绕过对象的QuerySet
方法。)由于默认管理器将隐藏已删除的对象,删除的对象消失,必须通过delete
经理明确要求。
使用此设置需要定义deleted_objects
和DeletionQuerySet
,并将DeletionManager
,date_deleted
和objects
添加到您的模型中。
谢谢,
P.S。,忘了提到这种从默认管理器中过滤对象的方法是strongly discouraged!
deleted_objects
答案 0 :(得分:1)
我认为当前在使用,流行,技术的任何事情,没有办法有问题域不可知,通用软删除。 我认为它与历史/历史数据库系统的关系比我们使用的更多。 我建议你不要绕过django的删除(这是一个很难删除)。保持原样。
您最有可能在我们的系统中拥有的“删除”,占90%,视觉删除......
在这方面,尝试为您的特定域问题找到带删除的同义词,并从项目的开头执行此操作。
因为抱怨IsVisible,IsUnpublished(甚至是IsDeleted)搞砸了你的查询,他们抱怨你必须小心包含它们......
但这显然是对域名问题的无知,如果域中有可以隐藏或未发布的对象 - 当然当你查询要显示的所有对象的列表时,你应该从开始,查询所有不可见和未发布的对象,因为这是您的域名问题以完整形式解决的方式。
干杯。