6

定義

  • SOFT DELETE-データベースからオブジェクトを削除しませんが、削除するように見えます
  • HARDDELETE-オブジェクトをデータベースから完全に削除します

質問

コードベース(具体的には、Djangoプロジェクト)にソフト削除を実装するための最良の方法は何ですか?

私が思う最も簡単な方法は、単純に次を追加することです。

is_deleted = models.BooleanField(default=False)

を実装するスーパークラスに移動しsoftDeleteObject、オーバーライドdelete()して問題のオブジェクトに適切なフラグを設定します。関連するオブジェクトも同じスーパークラスから継承する必要があります。

別の方法は、代わりに元のオブジェクトを削除し、削除されたオブジェクトの表現であるアーカイブオブジェクトに相当するものを用意することです。

分析

最初のものはより単純に見えますが、いくつかの広範囲のオーバーライドが必要です-たとえば、User削除されたすべてのオブジェクトの外部キー関係が保持されていることを確認するためにオーバーライドする必要があり、ユーザーを削除すると、ソフト削除されたすべてのオブジェクトをハード削除します。

2つ目は、代理オブジェクトの作成をトリガーするpre_deleteシグナルを使用して実装できます。これにもいくつかの利点がありますが(すべてのdelete()メソッドをオーバーライドする必要はありません)、プロジェクトで使用されるモデルのアーカイブバージョンを実装する必要があります。

どちらが望ましいですか、そして他の選択肢はありますか?

4

1 に答える 1

1

必要な特定のモデルでアクティブ/削除/ステータスフラグを使用しないのはなぜですか?または、アプリdjango-reversionを確認してください。おそらく、必要なものはすべて揃っています;)

于 2013-02-19T12:48:54.670 に答える