3

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

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

它的工作原理是 m2m 字段,其中“产品”是 Product 类的对象,

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()它只返回当前(最后)版本的列表,即使元素的数量发生了变化。

4

2 回答 2

4

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

some_version.revision.version_set.all()

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

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

请注意,顺便说一句,reversions 应该知道它应该遵循关系。使用低级 API

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

于 2011-07-01T10:31:32.850 回答
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)]

这方面的文档现在在 Read the Docs 上。请参阅低级 API 页面的“高级模型注册”部分。

于 2014-01-03T23:27:11.907 回答