2016-06-20 8 views
4

デフォルトデータベースにA - > B - > C - > Dというdjangoモデルがあるとします。ソフト削除djangoデータベースオブジェクト

Cは、オブジェクトAの削除にはA.

にCとCで同様にB、Dの外部キーであり、ジャンゴのデフォルトの動作は、すべてのオブジェクトが直接的または間接的に関連することがあるだろう自動的に削除されます(削除カスケードで)。そのため、B、C、Dは自動的に削除されます。

Aのオブジェクトを削除すると 'del'という名前の別のデータベースに移動するような方法で削除を実装したいと考えています。またB、C、Dの他のすべての関連オブジェクトも取得します移動した。

これを簡単に実装する方法はありますか?

+0

別のデータベースまたはテーブルに移動していますか? – e4c5

+0

別のデータベース –

+0

あなたのRDBMSは何ですか? – e4c5

答えて

0

モデルAdeleteメソッドをオーバーライドし、削除する前に関係を確認してください。空でない場合は、オブジェクトを別のテーブル/ DBに移動します。

4

私は次のように別のデータベースに物事を動かすのではなく、私のデータベースの各モデルに削除フラグを使用して、この事を実装している次のように

deleted = models.BooleanField(default=False) 

をそして各モデルのsoft_del関数を定義した:

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

したがって、削除されたモデルは、削除フラグがTrueに設定された同じデータベースに存在します。

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

を、次いで子ときのsoft_delを呼び出す次のようにも

ON DELETE CASCADEの効果を生成するためには、私は、各モデルにそのようなsoft_del機能を追加し、モデル内の各外部キーにrelated_nameを与えています

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

    self.save() 
0

ソフト削除時のdjangoのデフォルトの削除動作に一致するライブラリがあります。 (つまり、カスケードを使用する、何もしないなど、モデル仕様のオプションなど)。

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

PS:ライブラリはベータモードが、アクティブまだ開発中です。

関連する問題