我在我的项目中使用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()
时,它会返回当前(最后)版本的列表,即使元素数量发生了变化。
答案 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”部分。