首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用django-reversion还原相关对象

如何使用django-reversion还原相关对象
EN

Stack Overflow用户
提问于 2014-12-29 18:59:09
回答 1查看 960关注 0票数 2

如何通过django-reversion还原相关对象。

我试过以下不起作用的.

models.py:

代码语言:javascript
复制
@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)

和下面的测试

test.py:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 14:01:46

最后,我能够以一种不太理想的方式手动完成它:

我已经将代码放入自定义的QuerySet中。

代码语言:javascript
复制
class FooQuerySet(models.QuerySet):
    def restore(self, id):
        # restore
        deleted_list = reversion.get_deleted(self.model)
        deleted_list.get(id=id).revision.revert()

        # restore related 
        deleted_list = reversion.get_deleted(Bar)
        bar_set = filter(lambda s: s.field_dict['foo'] == id, deleted_list)

        for bar in bar_set:
            bar.revision.revert()

然后,Foo对象需要一个自定义管理器。

代码语言:javascript
复制
class Foo(models.Model):
    ...
    objects = FooQuerySet.as_manager()

可以从模型中自动提取相关字段。但手动操作对我来说已经足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27694443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档