2011-06-10 76 views
9

我正在尝试MongoEngine,这是一个供MongoDB使用的Python的DRM库。我可以从网站定义像这个例子中的典范:在YAML/JSON上快速创建模型

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。这是一个好场景吗?我只想让那些将使用该应用的人定义他们自己的模型,而不必深入代码。任何想法如何做动态模型创建赞赏

回答

5

如果你打算使用YAML,pyyaml是完全无痛的,并自动输出一个数据结构使用python的内置类型(或更复杂的类型,你定义) 。

你去任何办法,我也强烈建议Rx作为验证,因此您可以轻松地验证加载的文件的完整性。*

至于使用它来创建一个模型,你可以使用内置的函数type(不是type(object),但是type(name, bases, dict))......“[r]创建一个新类型对象,这实质上是类声明的一种动态形式。”

所以,你可以拨打:

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'])) 

*我一起在过去8使用小时这两个,巧合的是 - 他们一起工作怕疼,例如:

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") 
+0

伟大的信息;感谢这一点 – Profane 2011-08-18 01:34:33