私は最近、Django で と をオーバーライドして Soft Delete を実装しましdjango.db.models.query.QuerySet
たdjango.db.models.Manager
。
クエリセット:
class SoftDeleteQuerySet(QuerySet):
def delete(self):
super(SoftDeleteQuerySet, self).update(is_deleted=True, deleted=timezone.now())
def delete_hard(self):
super(SoftDeleteQuerySet, self).delete()
def deleted(self):
super(SoftDeleteQuerySet, self).filter(is_deleted=True)
マネジャー:
class SoftDeletionManager(models.Manager):
def __init__(self, *args, **kwargs):
self.show_deleted = kwargs.pop('show_deleted', False)
super(SoftDeletionManager, self).__init__(*args, **kwargs)
def get_queryset(self):
if self.show_deleted:
return SoftDeleteQuerySet(self.model)
return SoftDeleteQuerySet(self.model).filter(is_deleted=False)
def delete_hard(self, instance):
return self.get_queryset().delete_hard()
アクションを使用して change_list フォームからオブジェクトを削除すると、これはまったく問題なく機能します。しかし、詳細ビューに移動してオブジェクトを削除しようとすると、データベースから完全に削除されます。
これまでのところ、問題はMyModel.objects.get(...).delete()によるものであることがわかりました。間違った方向に進んでいないことを確認するために、Python シェルで確認しました。
./manage.py シェル:
>> Status.objects.all().count()
2
>> Status.all_objects.all().count()
4
>> Status.objects.get(pk=4).delete()
>> Status.objects.all().count()
1
>> Status.all_objects.all().count()
3
>> Status.objects.filter(pk=9).delete()
>> Status.objects.all().count()
0
>> Status.all_objects.all().count()
3
誰かが私にこの動作を説明し、これに対する解決策を提案してくれれば幸いです.
ジャンゴ 1.6.5
パイソン 3.4.0
前もって感謝します :)