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

时间:2012-04-12 03:07:12

标签: python django mptt

我遇到过很多情况,我想要一些数据库驱动的任意嵌套模板上下文。这个内容总是很简单,但结构也很不一样。

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

要解决这个问题,我想创建一个简单的数据库驱动的上下文模型。我可能会创建一个像django管理员这样的小框架来为特定目的生成默认结构。

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

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字典。问题是如何最好地区分子节点的列表和字典:作为子节点的单个字典,作为子节点的值列表或作为子节点的字典列表。

儿童被强迫进入的额外type字段?

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': '',
        },
    ],
}

通过子键确定?

  • 如果所有孩子共享相同的密钥,则为列表。忽略键。
  • 如果有一个+孩子,那就是字典。
  • 如果没有孩子,那就是一个字符串。

有什么建议吗?

PS:我没有腌制的唯一原因是因为我正在使用管理员来处理编辑这些数据,而我还没有真正探索过替换FileField。事实是,我没有深入研究存储。基本上我的动机是快速创造有用的东西。如果我强迫所有孩子成为字典项目并在解决我们的网站管理员的随机区域可编辑时解决我们的问题,那么这个系统大约需要5分钟“骨头库存”。

0 个答案:

没有答案