【发布时间】:2014-09-09 23:13:10
【问题描述】:
我最近在 Django 中通过覆盖 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 shell 中检查了它:
./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
如果有人可以向我解释这种行为并建议我解决这个问题,那就太好了。
Django 1.6.5
Python 3.4.0
在此先感谢 :)
【问题讨论】:
标签: django python-3.x django-models django-admin soft-delete