另一种方法是提供软(逻辑)删除或屏蔽(破坏)django模型,而不是从db中物理删除它们。
django-permanent-model的Python项目详细描述
Django永久性
另一种方法是提供软(逻辑)删除或屏蔽(破坏)django模型,而不是从db中物理删除它们。
型号
要创建不可删除的模型,只需从PermanentModel:
classMyModel(PermanentModel):pass
它会自动更改删除行为以隐藏对象,而不是删除它们:
>>>a=MyModel.objects.create(pk=1)>>>b=MyModel.objects.create(pk=2)>>>MyModel.objects.count()2>>>a.delete()>>>MyModel.objects.count()1
要恢复已删除的对象,只需调用其restore方法:
>>>a.restore()>>>MyModel.objects.count()2
使用forcekwarg强制物理删除:
>>>a.delete(force=True)# Will act as the default django delete>>>MyModel._base_manager.count()0
如果需要还原已删除的对象而不是重新创建相同的对象,请使用restore_on_create属性:
classMyModel(PermanentModel):classPermanent:restore_on_create=True
在此情况下,{TT5}$提供了相同属性对象的检查存在,并且如果它们被删除,则恢复它们,如果不是,则创建新的属性对象。
经理
它将默认模型管理器更改为忽略已删除的对象,并添加deleted_objectsmanager来查看它们:
>>>MyModel.objects.count()2>>>a.delete()>>>MyModel.objects.count()1>>>MyModel.deleted_objects.count()1>>>MyModel.all_objects.count()2>>>MyModel._base_manager.count()2
查询集
QuerySet.delete方法将作为默认的django delete,但有一个例外-子类模型的对象PermanentModel将被标记为deleted;其余的将被物理删除:
>>>MyModel.objects.all().delete()
您仍然可以强制django查询集物理删除:
>>>MyModel.objects.all().delete(force=True)
使用自定义查询集
从PermanentQuerySet:
继承查询集classServerFileQuerySet(PermanentQuerySet)pass
在模型管理器声明中包装PermanentQuerySet或DeletedQuerySet:
classMyModel(PermanentModel)objects=MultiPassThroughManager(ServerFileQuerySet,NonDeletedQuerySet)deleted_objects=MultiPassThroughManager(ServerFileQuerySet,DeletedQuerySet)all_objects=MultiPassThroughManager(ServerFileQuerySet,PermanentQuerySet)
方法get_restore_or_create
- 检查对象的存在。
- 如果已删除,请还原它。
- 创造一个新的,如果它从来没有被创造过。
字段名
名为“remove”的默认字段,但可以在settings.py:
PERMANENT_FIELD='deleted'
要求
- Django 1.7+
- Python2.7,3.4+