Django treebeard MP_Node树的对象多版本(修订)

1 投票
1 回答
676 浏览
提问于 2025-04-16 11:03

我正在使用Materialized Path树(这是django-treebeard提供的)来创建一个树形结构(https://bitbucket.org/hoverhell/xmppforum/src/27207da4a061/snapboard/models.py#cl-363)。

我想实现一个功能,可以编辑对象(帖子),并查看所有之前的版本。

我的问题是,存储这些旧版本的最佳位置在哪里?

目前我有两个想法——1. 把它们存放在帖子模型树中的某个特殊位置,或者2. 创建一个额外的模型来存储旧版本,这个模型可以(以某种方式)关联到一个MP_Node帖子对象,从而保存它的之前版本。但这两个想法看起来都不是很好。还有一个未完成的想法是将树和数据结构分开存放(从树中引用数据)。但我强烈怀疑这也会有很多问题。

1 个回答

1

总的来说,我是通过模型子类化来实现这个功能的(这意味着几乎是重复的表结构),使用了一个基础的抽象模型(里面包含了主要的数据),还有一个MP_Tree子类模型(以树形结构存储最新版本),其中的'previous'字段链接到一个包含旧版本的模型,而这个模型的'previous'又指向它自己。此外,我还使用了这个函数来“移动”对象,从树模型转到基础模型:

@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)

这可能还有更好的实现方式。

撰写回答