django之自定義軟刪除Model的方法
軟刪除
簡單的說,就是當(dāng)執(zhí)行刪除操作的時(shí)候,不正真執(zhí)行刪除操作,而是在邏輯上刪除一條記錄。這樣做的好處是可以統(tǒng)計(jì)數(shù)據(jù),可以進(jìn)行恢復(fù)操作等等。
預(yù)備知識
Managers
Managers 是django models 提供的一個(gè)用于提供數(shù)據(jù)庫查詢操作的接口,對于Django應(yīng)用程序中的每個(gè)model都會至少存在一個(gè)Manager
詳細(xì):https://docs.djangoproject.com/en/dev/topics/db/managers/
django實(shí)現(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="公司名稱")
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Pycharm編輯器功能之代碼折疊效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了Pycharm編輯器功能之代碼折疊效果的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Python 實(shí)現(xiàn)大整數(shù)乘法算法的示例代碼
這篇文章主要介紹了Python 實(shí)現(xiàn)大整數(shù)乘法算法的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09使用PyTorch將文件夾下的圖片分為訓(xùn)練集和驗(yàn)證集實(shí)例
今天小編就為大家分享一篇使用PyTorch將文件夾下的圖片分為訓(xùn)練集和驗(yàn)證集實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python用20行代碼實(shí)現(xiàn)批量摳圖功能
在日常的工作和生活中,我們經(jīng)常會遇到需要摳圖的場景,即便是只有一張圖片需要摳,也會摳得我們不耐煩。本文將為大家分享一個(gè)20行代碼就能實(shí)現(xiàn)是批量摳圖,需要的可以參考一下2022-05-05MAC下Anaconda+Pyspark安裝配置詳細(xì)步驟
一般MAC上使用的是zsh的shell工具,需要修改zshrc文件來使環(huán)境變量永久生效(若不修改該文件,在命令行中輸入相應(yīng)的命令即可,本文給大家介紹MAC下Anaconda+Pyspark安裝配置詳細(xì)步驟,感興趣的朋友跟隨小編一起看看吧2021-12-12python面試題之read、readline和readlines的區(qū)別詳解
當(dāng)python進(jìn)行文件的讀取會遇到三個(gè)不同的函數(shù),它們分別是read(),readline(),和readlines(),下面這篇文章主要給大家介紹了關(guān)于python面試題之read、readline和readlines區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-07-07anaconda jupyter不能導(dǎo)入安裝的lightgbm解決方案
這篇文章主要介紹了anaconda jupyter不能導(dǎo)入安裝的lightgbm解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03python如何把字符串類型list轉(zhuǎn)換成list
這篇文章主要介紹了python如何吧字符串類型list轉(zhuǎn)換成list,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02