簡體   English   中英

軟刪除django數據庫對象

[英]Soft delete django database objects

假設我在默認數據庫中有 django 模型,例如 A ->B ->C ->D。

C 是 D 中的外鍵,類似 C 中的 B 和 A 中的 C。

在刪除對象 A 時,Django 的默認行為是所有與 A 直接或間接相關的對象都會被自動刪除(在刪除級聯上)。因此,B、C、D 將被自動刪除。

我想以某種方式實現刪除,以便在刪除 A 的對象時,它會被移動到另一個名為“del”的數據庫。此外,B、C、D 的所有其他相關對象也將被移動。

有沒有一種簡單的方法可以一次性實現這一點?

我已經在我的數據庫的每個模型上使用一個刪除的標志來實現這個東西,而不是將東西移動到單獨的數據庫中,如下所示:

deleted = models.BooleanField(default=False)

並為每個模型定義了一個 soft_del 函數如下:

def soft_del(self):
        self.deleted = True            
        self.save()

因此,刪除的模型將存在於同一個數據庫中,刪除標志設置為 True。

同樣為了產生 ON DELETE CASCADE 效果,我向每個模型添加了這樣的 soft_del 函數,並為模型中的每個外鍵指定了一個related_name,如下所示:

class B(models.Model)
    a =  models.ForeignKey(A,related_name='related_Bs'))

然后在 parent 的 soft_del 中調用 child 的 soft_del,如下所示:

def soft_del_A(self):
    self.deleted = True 
    for b in A.related_Bs.all():
        b.soft_del_B()

    self.save()

只需覆蓋模型A delete方法並在刪除前檢查關系。 如果它不為空 - 將對象移動到另一個表/數據庫。

有一個庫與 django 在軟刪除上的默認刪除行為相匹配。 (即使用 Cascade、什么都不做等來自模型規范的選項)。

https://github.com/upgrad/django-deletes

PS:該庫仍處於 beta 模式,但正在積極開發中。

也許你可以試試https://github.com/drneox/django-paranoid

允許執行軟刪除並恢復它。

使用:

from django_paranoid.admin import ParanoidAdmin

class MyModelAdmin(ParanoidAdmin):
    pass

軟刪除:

m = MyModel.objects.last()
m.delete()

m = MyModel.objects.last()
>>> m
>>>

獲取刪除的對象:

m = MyModel.objects_with_deleted.last()
>>> m
<MyModel: name>
>>> m.deleted_at
datetime.datetime(2019, 8, 10, 6, 16, 44, 633727, tzinfo=<UTC>)

還原對象:

 m.restore()

硬刪除:

m = MyModel.objects.last()
m.delete(True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM