另一种方法是提供软(逻辑)删除或屏蔽(破坏)django模型,而不是从db中物理删除它们。

django-permanent-model的Python项目详细描述


Django永久性

另一种方法是提供软(逻辑)删除或屏蔽(破坏)django模型,而不是从db中物理删除它们。

https://api.travis-ci.org/MnogoByte/django-permanent.svg?branch=master

型号

要创建不可删除的模型,只需从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)

使用自定义查询集

  1. PermanentQuerySet

    继承查询集
    classServerFileQuerySet(PermanentQuerySet)pass
  2. 在模型管理器声明中包装PermanentQuerySetDeletedQuerySet

    classMyModel(PermanentModel)objects=MultiPassThroughManager(ServerFileQuerySet,NonDeletedQuerySet)deleted_objects=MultiPassThroughManager(ServerFileQuerySet,DeletedQuerySet)all_objects=MultiPassThroughManager(ServerFileQuerySet,PermanentQuerySet)

方法get_restore_or_create

  1. 检查对象的存在。
  2. 如果已删除,请还原它。
  3. 创造一个新的,如果它从来没有被创造过。

字段名

名为“remove”的默认字段,但可以在settings.py:

PERMANENT_FIELD='deleted'

要求

  • Django 1.7+
  • Python2.7,3.4+

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在jframe中模糊的背景上创建一个透明的矩形   java和super之间有区别。getX()和简单的x?   使用ant的java删除eclipse项目   java找不到。txt文件?   多线程Java wait()notify()   带按钮的java透明控件   java Android Studio 3无法构建我的项目   性能最佳(最快且节省内存)的Java收集/数据结构,可同时插入和删除项   spring+hibernate集成中的java ClassNotFoundException   java如何在Android上建立异步URL连接?   java当我选择contacts选项卡时,选项卡栏消失了   java根据数据库中的日期获取结果,不考虑时间   java如何访问WebChromeClient中的方法?   java如何在安卓中使用两行列表项?   spring Swagger Java日期格式验证引发异常