Несколько версий (ревизий) объектов с django treebeard MP_Node Tree - PullRequest
1 голос
/ 02 февраля 2011

Я использую дерево Материализованного Пути (предоставленное django-treebeard) для создания древовидной структуры (https://bitbucket.org/hoverhell/xmppforum/src/27207da4a061/snapboard/models.py#cl-363).

Я пытаюсь реализовать (восстановить) объект (Post)редактирование, позволяющее просматривать все предыдущие ревизии отредактированного объекта.

Вопрос в том, где было бы лучше хранить все старые ревизии?

К настоящему времени у меня есть две идеи - 1. сохранитьих в каком-то специальном месте в дереве режима Post, или 2. Реализовать дополнительную модель для старых ревизий, которой (каким-то образом) может быть предоставлен объект MP_Node Post для хранения (сохраняя также свои предыдущие ревизии).Но обе идеи выглядят не очень хорошо.Еще одна незавершенная идея - хранить дерево и структуры данных отдельно (ссылаясь на данные из дерева).Но я сильно подозреваю, что это тоже будет довольно проблематично.

1 Ответ

1 голос
/ 13 февраля 2011

В конце концов, я реализовал это с помощью подклассов моделей (что означает почти дублирующиеся структуры таблиц), с базовой абстрактной моделью (которая содержит первичные данные), моделью подклассов MP_Tree (с последними версиями в древовидной структуре) с 'предыдущими «как ссылка на модель со старыми ревизиями, в которой« предыдущая »указывает на себя. Кроме того, я использовал эту функцию для «перемещения» объектов из древовидной модели в базовую модель:

@classmethod
def make_from_post(cls, post):
    """ Create an object from another object, possibly of a slightly
    different class (like tree Post).  """
    data = {}
    for field in cls._meta.fields:
        if field.primary_key:
            continue
        # Assuming that all default fields for cls are None and thus
        # skipping 'None's from attribute values.
        attrdata = getattr(post, field.name, None)
        if attrdata is not None:
            data[field.name] = attrdata
    return cls(**data)

, что, вероятно, можно сделать лучше.

...