如何使用django恢复恢复相关对象

如何使用django恢复恢复相关对象,django,django-reversion,Django,Django Reversion,如何通过django恢复来恢复相关对象 我尝试了以下不起作用的方法 models.py: 下面的测试 test.py: 最后,我能够以某种次优方式手动完成: 我已将代码放入自定义查询集中 class FooQuerySet(models.QuerySet): def恢复(自我,id): #恢复 删除列表=恢复。删除(self.model) 已删除\u list.get(id=id).revision.revert() #恢复相关 删除列表=恢复。删除(条形) bar\u set=filter

如何通过django恢复来恢复相关对象

我尝试了以下不起作用的方法

models.py:

下面的测试

test.py:


最后,我能够以某种次优方式手动完成:

我已将代码放入自定义查询集中

class FooQuerySet(models.QuerySet):
def恢复(自我,id):
#恢复
删除列表=恢复。删除(self.model)
已删除\u list.get(id=id).revision.revert()
#恢复相关
删除列表=恢复。删除(条形)
bar\u set=filter(lambda s:s.field\u dict['foo']==id,已删除\u列表)
对于bar_集合中的bar:
bar.revision.revert()
然后
Foo
对象需要有一个自定义管理器

Foo类(models.Model):
...
objects=fookqueryset.as_manager()
可以从模型中自动提取相关字段。但是对于我来说,手动操作就足够了

@reversion.register(follow=['bar_set',])
class Foo(models.Model):
    def save(self, *args, **kwargs):
        with transaction.atomic(), reversion.create_revision():
            return super(Foo, self).save(*args, **kwargs)

@reversion.register
class Bar(models.Model):
    foo = models.ForeignKey(Foo)

    def save(self, *args, **kwargs):
        with transaction.atomic(), reversion.create_revision():
            return super(Bar, self).save(*args, **kwargs)
class TestModels(TestCase):
    def test_soft_delete(self):
        from myapp.models import Foo, Bar
        a = Foo()
        a.save()

        b1 = Bar(foo=a)
        b1.save()
        b2 = Bar(foo=a)
        b2.save()

        a.delete()

        self.assertEqual(0, Foo.objects.count())
        self.assertEqual(0, Bar.objects.count())

        version = reversion.get_deleted(Foo)[0]  # There is only one.
        version.revert()

        self.assertEqual(1, Foo.objects.count())
        self.assertEqual(2, Bar.objects.count()) # HERE IT FAILS: 2 != 0