django-reversion还在管理员之外还原ManyToMany字段

时间:2011-07-01 10:06:56

标签: django manytomanyfield m2m django-reversion

我在我的项目中使用django-reversion。 除了一件事,它的效果很好: 我无法获得ManyToMany字段的先前版本。但是在django admin中它是有效的,而不是在我的代码中。 要获取以前的版本,我使用以下代码:

  

vprod = Version.objects.get_for_date(product,ondate).get_object_version()。object

除了m2m字段外它有效 其中'product'是Product class的对象,

class Product(models.Model):
    name = models.CharField(max_length=255)
    elements = models.ManyToManyField(Sku)

class Sku(models.Model):
    name = models.CharField(max_length=255, verbose_name="SKU Name")

我可以获得vprod.name并返回我需要的内容,但是当我尝试vprod.elements.all()时,它会返回当前(最后)版本的列表,即使元素数量发生了变化。

2 个答案:

答案 0 :(得分:4)

如果我理解正确,我认为您应该获得该版本的修订版;版本包含对象的数据,修订版包含多个对象的版本。看看:

  

some_version.revision.version_set.all()

具体来说,我认为你应该使用(未经测试):

  

[       v.for Version.objects.get_for_date(product,ondate).revision.version_set.all()       如果version.content_type == ContentType.objects.get_for_model(Sku)   ]

请注意,顺便说一下,逆转应该知道它应该遵循关系。使用low level API

  

reversion.register(YourModel,follow = [“your_foreign_key_field”])

答案 1 :(得分:4)

我有同样的问题,感谢@ Webthusiast的回答我得到了我的工作代码。适应你的例子将是这样的。

进口:

from django.contrib.contenttypes.models import ContentType
import reversion

注册您的模特:

reversion.register(Sku)
reversion.register(Product, follow=['elements'])

然后你可以迭代:

object = Product.objects.get(some_id)
versions = reversion.get_for_object(self.object)
for version in versions:
    elements = [v.object_version.object \
        for v in version.revision.version_set.all() \
        if v.content_type == ContentType.objects.get_for_model(Product)]

现在的文档是阅读文档。请参阅低级API页面的“Advanced model registration”部分。