我遇到过很多我想要一些数据库驱动的任意嵌套模板上下文的情况。此内容总是很简单,但结构差异很大。
过去,我为网站的一小部分创建模型,随着模型数量的增加,维护起来很快就变成了一场噩梦,我开始为每个可编辑内容的小区域重复自己。管理员对一个特定的部分充满了内联。
为了解决这个问题,我想创建一个简单的数据库驱动上下文模型。我可能会创建一个像 django's 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 字典。问题是如何最好地区分子节点的列表和字典:单个字典作为子节点,值列表作为子节点,或字典列表作为子节点。
孩子们被迫进入的额外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 分钟内工作。