【问题标题】:django-reversion revert ManyToMany fields outside admindjango-reversion 恢复管理员外的多对多字段
【发布时间】:2011-09-26 15:42:21
【问题描述】:

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

【问题讨论】:

  • 我只想在定义的时间内收到我的产品的元素列表。但是上面的代码只返回最后状态的元素列表,但在定义的时间内命名。

标签: django manytomanyfield m2m django-reversion


【解决方案1】:

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

some_version.revision.version_set.all()

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

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

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

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

【讨论】:

  • > reversion.register(YourModel, follow=["your_foreign_key_field"]) 我做到了,据我所知 some_version.revision.version_set.all() 与 .get_object_version() 几乎相同
  • 你试过了吗? some_version.get_object_version() 给出了一个“反序列化对象”,some_version.revision.version_set.all 给出了一个查询集,其中包含所有(关注的)对象的版本,同时与 some_version。版本的问题在于它们引用模型实例,而不是版本,因此您应该从 some_version.revision.version_set 获取后续模型实例的版本。
【解决方案2】:

我遇到了同样的问题,感谢@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 页面的“Advanced model registration”部分。

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 2011-06-26
    • 2013-03-12
    • 2012-08-23
    • 2022-11-08
    • 2014-09-01
    • 2014-10-20
    • 2013-05-29
    • 2015-12-17
    相关资源
    最近更新 更多