我正在尝试MongoEngine,这是一个用于Python的DRM库,可用于MongoDB。我可以从网站定义一个类似这个例子的模型:
class User(Document):
email = StringField(required=True)
first_name = StringField(max_length=50)
last_name = StringField(max_length=50)
它就像一个魅力,MongoEngine非常好。好吧,我想更进一步,想知道我是否可以在JSON或YAML文件中的某个地方定义我的模型,或者其他什么,然后使用它创建模型。所以这个声明在JSON中看起来像这样:
{
"model":"User",
"fields":{
"email":{
"type":"string",
"required":"true"
},
"first_name":{
"type":"string",
"max_length":"50"
},
"last_name":{
"type":"string",
"max_length":"50"
}
}
}
然后我会解析这个JSON并使用它创建一个模型。可能只是我可以在每次修改模型定义时执行的单个导入操作,或者可能每次都可以解析整个JSON。那是一个好方案吗?我只想让使用该应用程序的人定义他们自己的模型,而不必深入研究代码。任何关于如何进行动态模型创建的想法都值得赞赏
答案 0 :(得分:5)
如果您要使用YAML,pyyaml完全无痛,并使用python的内置类型(或您定义的更复杂的类型)自动输出数据结构。
无论如何,我还强烈推荐Rx作为验证器,以便您轻松验证已加载文件的完整性。*
至于使用它来创建模型,你可以使用内置函数type
(不是type(object)
,而是type(name, bases, dict)
)......“[r] eturn a new type object。这实际上是类声明的动态形式。“
所以,你可以打电话:
def massage(fields_dict):
#transform your file format into a valid set of fields, and return it
user_class = type(yaml_data['model'], Document, massage(yaml_data['fields']) )
*我在过去的八个小时里一起使用了这两个,巧合的是 - 他们一起无痛地工作,例如:
import yaml
import Rx
data = yaml.load(open("foo.yaml")
rx = Rx.Factory({ "register_core_types": True })
schema = rx.make_schema(yaml.load(open("schema.yaml")))
if not schema.check(data):
raise ValueError("data file contents are not in a valid format")