2

Django の DeleteView を使用して、異なるモデルのオブジェクトを削除しています。

問題は、オブジェクトを完全に削除するのではなく、非表示にすることです。最初に、ビューをそのままにしておくのが理にかなっていると思いましたが、代わりに各モデルで削除メソッドをオーバーライドして、次のようにします

def delete(self, force=False):
    if force:
        return super(ModelName, self).delete()
    else:
        self.is_deleted = True
        self.save()

しかし、一括削除では削除メソッドが呼び出されないことに気付きました。このメソッドはリスクが高すぎます。

誰かがこれを行うための良い方法を推奨できますか? 私はまだ DeleteView の通常の動作を維持したいのですが、オブジェクトを削除するのではなく、単に「非アクティブ化」する必要があります。

DeleteView は次のとおりです。

def delete(self, request, *args, **kwargs):
    """
    Calls the delete() method on the fetched object and then
    redirects to the success URL.
    """
    self.object = self.get_object()
    success_url = self.get_success_url()
    self.object.delete()
    return HttpResponseRedirect(success_url)

self.object.delete()と交換すれば足りますか?

self.object.is_deleted = True
self.object.save()

オブジェクトを削除済みとしてマークした場合、クエリセットに削除済みオブジェクトが含まれないようにするにはどうすればよいですか? ListView の get_queryset() を単純に置き換えることもできますが、ページ上のクエリセットから除外する必要があるため、代わりにオブジェクト マネージャーをカスタマイズすると、より良い結果が得られるのでしょうか?

私はdjango-reversionを見てきました。通常の方法ですべてのオブジェクトを削除し、それらを復元したい場合は django-reversion を使用できますか? このソリューションの欠点はありますか?

4

2 に答える 2

1

しかし、一括削除では削除メソッドが呼び出されないことに気付きました。このメソッドはリスクが高すぎます。

そのために独自の QuerySet を作成し、それを as_manager として使用できます。Same QuerySet は、削除されたフィールドを非表示にして非表示にすることができます。削除したすべてのフィールドを取得する方法を忘れずに残してください。

于 2015-02-16T09:27:21.107 に答える