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