定義
- SOFT DELETE-データベースからオブジェクトを削除しませんが、削除するように見えます
- HARDDELETE-オブジェクトをデータベースから完全に削除します
質問
コードベース(具体的には、Djangoプロジェクト)にソフト削除を実装するための最良の方法は何ですか?
私が思う最も簡単な方法は、単純に次を追加することです。
is_deleted = models.BooleanField(default=False)
を実装するスーパークラスに移動しsoftDeleteObject
、オーバーライドdelete()
して問題のオブジェクトに適切なフラグを設定します。関連するオブジェクトも同じスーパークラスから継承する必要があります。
別の方法は、代わりに元のオブジェクトを削除し、削除されたオブジェクトの表現であるアーカイブオブジェクトに相当するものを用意することです。
分析
最初のものはより単純に見えますが、いくつかの広範囲のオーバーライドが必要です-たとえば、User
削除されたすべてのオブジェクトの外部キー関係が保持されていることを確認するためにオーバーライドする必要があり、ユーザーを削除すると、ソフト削除されたすべてのオブジェクトをハード削除します。
2つ目は、代理オブジェクトの作成をトリガーするpre_deleteシグナルを使用して実装できます。これにもいくつかの利点がありますが(すべてのdelete()
メソッドをオーバーライドする必要はありません)、プロジェクトで使用されるモデルのアーカイブバージョンを実装する必要があります。
どちらが望ましいですか、そして他の選択肢はありますか?