动态创建YAML/JSON模型

Ser*_*rov 9 python json yaml model mongodb

我正在尝试MongoEngine,一个用于Python的DRM库,用于MongoDB.我可以从网站定义这个例子的模型:

class User(Document):
    email = StringField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力,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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我会解析这个JSON并使用它创建一个模型.可能只是我可以在每次修改模型定义时执行的单个导入操作,或者可能每次都可以解析整个JSON.那是一个好方案吗?我只想让使用该应用程序的人定义他们自己的模型,而不必深入研究代码.任何有关如何进行动态模型创建的想法都表示赞赏

Nat*_*ate 5

如果您要使用YAML,pyyaml是完全无痛的,并使用python的内置类型(或您定义的更复杂的类型)自动输出数据结构.

无论如何,我还强烈推荐Rx作为验证器,以便您可以轻松验证加载文件的完整性.*

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

所以,你可以打电话:

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']) )
Run Code Online (Sandbox Code Playgroud)

*巧合的是,我在过去八小时内一起使用了这两种方法 - 它们无痛地协同工作,例如:

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")
Run Code Online (Sandbox Code Playgroud)