Django 自定義軟刪除Model

軟刪除介紹

簡單的說董习,就是當(dāng)執(zhí)行刪除操作的時候枫慷,不真正執(zhí)行刪除操作丑念,而是在邏輯上刪除一條記錄涡戳。這樣做的好處是可以統(tǒng)計數(shù)據(jù),可以進(jìn)行恢復(fù)操作等等脯倚。
Managers 是django models 提供的一個用于提供數(shù)據(jù)庫查詢操作的接口渔彰,對于Django應(yīng)用程序中的每個model都會至少存在一個Manager
詳細(xì):https://docs.djangoproject.com/zh-hans/3.2/topics/db/managers/

django實(shí)現(xiàn)軟刪除model

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

# 自定義軟刪除抽象基類
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  # 成功發(fā)送Signal信號需要將abstract設(shè)置為true
        auto_created = False

    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)

model demo代碼開發(fā)

class Server(SoftDeletableModel):
    id = models.AutoField(primary_key=True)
    local_ip = models.CharField('內(nèi)網(wǎng)ip', max_length=30, blank=True, null=True)
  
    class Meta:
        db_table = 'dbmanage_server'

class ServerBase(models.Model):
    id = models.AutoField(primary_key=True)
    local_ip = models.CharField('內(nèi)網(wǎng)ip', max_length=30, blank=True, null=True)
    is_deleted = models.BooleanField('是否刪除', default=False)

    class Meta:
        managed = False  # 在migrate時不會創(chuàng)建該表
        db_table = 'dbmanage_server'

繼承了軟刪除模型類SoftDeletableModel的模型server,在進(jìn)行migrate建表操作時推正,自動會給Server表添加上一個is_deleted字段恍涂。后續(xù)的數(shù)據(jù)刪除操作中只需要執(zhí)行delete(),即可將數(shù)據(jù)的is_deleted設(shè)置為True植榕。查詢操作時再沧,不需要加上條件限制,自動會返回is_deleted=False的數(shù)據(jù)尊残。

Tips

1:Server模型無法發(fā)送信號
增加代碼abstract = True(具體細(xì)節(jié)不太了解炒瘸,看源碼里要求的)
2:需要查詢已經(jīng)刪除掉的數(shù)據(jù)
有時候想要展示已經(jīng)刪除的數(shù)據(jù),但是Server模型里是自動過濾掉刪除數(shù)據(jù)的寝衫。
增加一個ServerBase模型類顷扩,在進(jìn)行查詢時使用該類,記得增加managed=Fasle慰毅,這樣在migrate時不會django不會去創(chuàng)建該表隘截。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子婶芭,更是在濱河造成了極大的恐慌东臀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雕擂,死亡現(xiàn)場離奇詭異啡邑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)井赌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門谤逼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仇穗,你說我怎么就攤上這事流部。” “怎么了纹坐?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵枝冀,是天一觀的道長。 經(jīng)常有香客問我耘子,道長果漾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任谷誓,我火速辦了婚禮绒障,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捍歪。我一直安慰自己户辱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布糙臼。 她就那樣靜靜地躺著庐镐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪变逃。 梳的紋絲不亂的頭發(fā)上必逆,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機(jī)與錄音揽乱,去河邊找鬼末患。 笑死,一個胖子當(dāng)著我的面吹牛锤窑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嚷炉,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渊啰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绘证,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隧膏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嚷那,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胞枕,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年魏宽,在試婚紗的時候發(fā)現(xiàn)自己被綠了腐泻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡队询,死狀恐怖派桩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚌斩,我是刑警寧澤铆惑,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站送膳,受9級特大地震影響员魏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叠聋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一撕阎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晒奕,春花似錦闻书、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闷袒,卻和暖如春坑律,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囊骤。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工晃择, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人也物。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓宫屠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滑蚯。 傳聞我的和親對象是個殘疾皇子浪蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容