我在我的项目中使用 django-reversion。 它工作得很好,除了一件事: 我无法获得以前版本的 ManyToMany 字段。但是在 django admin 中它是有效的,而不是在我的代码中。 要获取以前的版本,我使用以下代码:
vprod = Version.objects.get_for_date(product, ondate).get_object_version().object
除了 m2m 字段外,它也可以工作 其中 'product' 是 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()
时,它仅返回当前(最后一个)列表版本,即使元素的数量发生了变化。
最佳答案
如果我理解正确的话,我认为你应该得到版本的revision;版本包含对象的数据,修订包含多个对象的版本。看看:
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 应该知道它应该遵循关系。使用 low level API :
reversion.register(YourModel, follow=["your_foreign_key_field"])
关于django-reversion 恢复管理员外的多对多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6546536/