django-reversion вернуть поля ManyToMany за пределы администратора - PullRequest
3 голосов
/ 01 июля 2011

Я использую django-reversion в своем проекте.И это работает хорошо, за исключением одного: я не могу получить предыдущие версии полей ManyToMany.Но в админке django это работает, а не в моем коде.Чтобы получить предыдущую версию, я использую следующий код:

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(), он возвращает список только текущей (последней) версии, даже если количество элементов изменилось.

Ответы [ 2 ]

4 голосов
/ 04 января 2014

У меня была такая же проблема, и благодаря ответу @ 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 низкого уровня.

4 голосов
/ 01 июля 2011

Если я правильно понимаю, я думаю, вы должны получить ревизию для версии;версия содержит данные объекта, ревизия содержит версии для нескольких объектов.Посмотрите на:

some_version.revision.version_set.all ()

Конкретно, я думаю, что вы должны использовать (не проверено):

[v для v в Version.objects.get_for_date (product, ondate) .revision.version_set.all () if version.content_type == ContentType.objects.get_for_model (Sku)]

ПримечаниеКстати, что реверсии должны знать, что это должно следовать отношениям.Использование API низкого уровня :

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

...