Python 数据库驱动的MPTT模板上下文:如何表示列表与字典?

Python 数据库驱动的MPTT模板上下文:如何表示列表与字典?,python,django,mptt,Python,Django,Mptt,我遇到过许多情况,其中我需要一些数据库驱动的任意嵌套模板上下文。这个内容总是很简单,但在结构上变化很大 在过去,我为网站的一小部分创建了模型,随着模型数量的增加,这些模型很快就变成了一场噩梦,我开始为可编辑内容的每一个小区域重复我自己。管理员得到了一个特定部分的所有内联线 为了解决这个问题,我想创建一个简单的DB驱动的上下文模型。我可能会创建一个像django的admin这样的小框架,为给定的目的生成默认结构 我当前的模型基本上是这样的: class DBContext(MPTTModel):

我遇到过许多情况,其中我需要一些数据库驱动的任意嵌套模板上下文。这个内容总是很简单,但在结构上变化很大

在过去,我为网站的一小部分创建了模型,随着模型数量的增加,这些模型很快就变成了一场噩梦,我开始为可编辑内容的每一个小区域重复我自己。管理员得到了一个特定部分的所有内联线

为了解决这个问题,我想创建一个简单的DB驱动的上下文模型。我可能会创建一个像django的admin这样的小框架,为给定的目的生成默认结构

我当前的模型基本上是这样的:

class DBContext(MPTTModel):
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
    key = models.CharField(max_length=256)
    value = models.TextField(blank=True)
    file = models.FileField(upload_to='dbcontext/files/', blank=True, null=True)
从这个模型中,我可以轻松创建任意深度的python字典。问题是如何最好地区分子节点的列表和字典:将单个字典作为子节点,将值列表作为子节点,或将字典列表作为子节点

一个额外的
类型
字段,强制子项进入该字段? 通过子键确定?
  • 如果所有子项共享同一个键,则它是一个列表。忽略关键点
  • 如果有一个以上的孩子,那就是一本字典
  • 如果没有孩子,那就是一根绳子
有什么建议吗


PS:我不酸洗的唯一原因是,我正在使用管理员来处理编辑这些数据,而我还没有真正探讨如何替换
文件字段。事实上,我并没有深入研究仓库。基本上,我的动机是快速创建一些有用的东西。该系统在大约5分钟的“骨量”内工作如果我强制所有的子项都是字典项,并解决了我们在使网站管理员的随机区域可编辑时遇到的问题。

我开始探索一种干净的方法来实现一个pickle字段,该字段支持实例化
文件字段
/将文件上载到文件字段存储。更新:我已经解决了嵌套的dict/列表使用YAML字段时出现问题。它允许任意复杂度,甚至有引用指针,可以表示任何深度的任何python结构。我开始探索一种干净的方法来实现一个pickle字段,该字段支持实例化
文件字段
/将文件上载到文件字段存储。更新:我通过使用YAML字段解决了嵌套的dict/list问题。它允许任意复杂度,甚至有引用指针,并且可以表示任何深度的任何python结构。
class DBContext(MPTTModel):
    NONE = 0
    LIST = 1
    DICTIONARY = 2
    COERCE_TYPES = [
        (NONE, 'None'),
        (LIST, 'Children as list'), # ignore keys.
        (DICTIONARY, 'Children as Dictionary'),
    ]
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
    key = models.CharField(max_length=256)
    value = models.TextField(blank=True)
    coerce_type = models.IntegerField(default=0, choices=COERCE_TYPES)

    def to_python(self):
        # when converting to python, any children of a node would be coerced into the value_type type


# Converted to python:
{
    'foo': { # coerce_type == DICTIONARY
        'child_node_as_dict': '',
    },
    'bar': [ # coerce_type == LIST
        'child_node_as_list',
    ],
    'baz': [ # coerce_type == LIST
        { # coerce_type == DICTIONARY
            'child_node_list_of_dicts': '',
        },
    ],
}