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