2

私は最近、Django で と をオーバーライドして Soft Delete を実装しましdjango.db.models.query.QuerySetdjango.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

前もって感謝します :)

4

1 に答える 1