django之自定义软删除Model的方法
2019-08-14 16:10
2046 查看
软删除
简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录。这样做的好处是可以统计数据,可以进行恢复操作等等。
预备知识
Managers
Managers 是django models 提供的一个用于提供数据库查询操作的接口,对于Django应用程序中的每个model都会至少存在一个Manager
详细:https://docs.djangoproject.com/en/dev/topics/db/managers/
django实现软删除model
firstly,
from django.db import models from django.db.models.query import QuerySet # 自定义软删除查询基类 class SoftDeletableQuerySetMixin(object): """ QuerySet for SoftDeletableModel. Instead of removing instance sets its ``is_deleted`` field to True. """ def delete(self): """ Soft delete objects from queryset (set their ``is_deleted`` field to True) """ self.update(is_deleted=True) class SoftDeletableQuerySet(SoftDeletableQuerySetMixin, QuerySet): pass class SoftDeletableManagerMixin(object): """ Manager that limits the queryset by default to show only not deleted instances of model. """ _queryset_class = SoftDeletableQuerySet def get_queryset(self): """ Return queryset limited to not deleted entries. """ kwargs = {'model': self.model, 'using': self._db} if hasattr(self, '_hints'): kwargs['hints'] = self._hints return self._queryset_class(**kwargs).filter(is_deleted=False) class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager): pass
secondly,
# 自定义软删除抽象基类 class SoftDeletableModel(models.Model): """ An abstract base class model with a ``is_deleted`` field that marks entries that are not going to be used anymore, but are kept in db for any reason. Default manager returns only not-deleted entries. """ is_deleted = models.BooleanField(default=False) class Meta: abstract = True objects = SoftDeletableManager() def delete(self, using=None, soft=True, *args, **kwargs): """ Soft delete object (set its ``is_deleted`` field to True). Actually delete object if setting ``soft`` to False. """ if soft: self.is_deleted = True self.save(using=using) else: return super(SoftDeletableModel, self).delete(using=using, *args, **kwargs) class CustomerInfo(SoftDeletableModel): nid = models.AutoField(primary_key=True) category = models.ForeignKey("CustomerCategory", to_field="nid", on_delete=models.CASCADE, verbose_name='客户分类', db_constraint=False) company = models.CharField(max_length=64, verbose_name="公司名称")
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- Yii2框架 model方法下setAttributes用法(自定义model 添加方法)
- dede系统自定义变量删除方法
- django模型层(model)进行建表、查询与删除的基础教程
- Django admin 常用方法 model 增加只读权限
- Django实现删除课程方法——Ajax
- 自定义 Django的User Model,扩展 AbstractUser类注意事项
- 初学django1-django模型中自定义方法从身份证号码中获取出生日期
- Django模板语言中的自定义方法filter过滤器实现web网页的瀑布流
- django model的get和filter方法的区别
- GridView自定义删除操作的具体方法
- Django model 中设置联合约束和联合索引的方法
- Django自定义模型(model)中的字段标签
- django model form 保存方法 django-rest-framework save 修改某一项值 方法
- django model中get()和filter()方法的区别
- DataGrid自定义分页以及几种常用的删除方法
- django中将model转换为dict的方法
- django model 插入数据方法
- asp.net MVC利用自定义ModelBinder过滤关键字的方法(附demo源码下载)
- 四【用django2.0来开发】后台会员管理(二) ModelForm表单的使用方法以及数据验证
- iOS开发学习之利用系统远程UITableView 自定义滑动删除按钮、增加自定义滑动按钮方法