django之自定義軟刪除Model的方法
軟刪除
簡單的說,就是當執(zhí)行刪除操作的時候,不正真執(zhí)行刪除操作,而是在邏輯上刪除一條記錄。這樣做的好處是可以統(tǒng)計數(shù)據(jù),可以進行恢復操作等等。
預備知識
Managers
Managers 是django models 提供的一個用于提供數(shù)據(jù)庫查詢操作的接口,對于Django應用程序中的每個model都會至少存在一個Manager
詳細:https://docs.djangoproject.com/en/dev/topics/db/managers/
django實現(xiàn)軟刪除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="公司名稱")
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Pycharm編輯器功能之代碼折疊效果的實現(xiàn)代碼
這篇文章主要介紹了Pycharm編輯器功能之代碼折疊效果的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Python 實現(xiàn)大整數(shù)乘法算法的示例代碼
這篇文章主要介紹了Python 實現(xiàn)大整數(shù)乘法算法的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09python面試題之read、readline和readlines的區(qū)別詳解
當python進行文件的讀取會遇到三個不同的函數(shù),它們分別是read(),readline(),和readlines(),下面這篇文章主要給大家介紹了關于python面試題之read、readline和readlines區(qū)別的相關資料,需要的朋友可以參考下2022-07-07anaconda jupyter不能導入安裝的lightgbm解決方案
這篇文章主要介紹了anaconda jupyter不能導入安裝的lightgbm解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03