1. 程式人生 > >Django自定義軟刪除Model

Django自定義軟刪除Model

Django 自定義軟刪除Model

起源:

一些資料不會真的去刪除,而是給資料標記一個flag,表示它被刪除了,然後感覺每次都寫一個這樣的欄位超級麻煩,並且有時候給篩選的時候一不小心的疏漏可能導致被刪除的例項重新回到列表中。。。# [編碼中還是總充滿這小驚喜的哈],因此打算實現一個可以軟刪除的Model,這樣每次需要軟刪除就方便多了。

測試環境:Django2.0 Python3.6

在這裡多說一句哈,個人比較喜歡3.6的格式化字串語法,作為一個懶蟲,能省掉一個format,何樂而不為哈

具體實現:

首先,先寫一個model,當然,在這之前如果不熟悉Managers的話,建議先看一下

官方文件Manager , 因為要自己處理一下那個標記,在這裡用到了Managers。

話不多說了,直接上程式碼

class SoftDeletableQuerySet(QuerySet):
    def delete(self):
        self.update(is_deleted=True)

class SoftDeletableManager(models.Manager):
    """
    僅返回未被刪除的例項
    """
    _queryset_class = SoftDeletableQuerySet

    def get_queryset
(self):
""" 在這裡處理一下QuerySet, 然後返回沒被標記位is_deleted的QuerySet """ 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
SoftDeletableModel(models.Model):
""" 抽象類,新增is_deleted 欄位 """ is_deleted = models.BooleanField(default=False) class Meta: abstract = True objects = SoftDeletableManager() def delete(self, using=None, soft=True, *args, **kwargs): """ 這裡需要真刪除的話soft=False即可 """ if soft: self.is_deleted = True self.save(using=using) else: return super(SoftDeletableModel, self).delete(using=using, *args, **kwargs)

在這裡我用的is_deleted欄位,大家可以自己換成自己喜歡的欄位,由於要保證介面統一性,我所有的刪除欄位都用的它哈。

然後其他的model 繼承他就好了一個簡單的demo

class SoftDeletableModelDemo(SoftDeletableModel):
    key = models.CharField(max_length=32, blank=True)

    class Meta:
        db_table = 'soft_deletable_model_demo'

好了,實現軟刪除到這裡就結束了,有問題歡迎大家斧正哈,小白敬上^o^。