即时从 YAML/JSON 创建模型

Posted

技术标签:

【中文标题】即时从 YAML/JSON 创建模型【英文标题】:Create a model from YAML/JSON on the fly 【发布时间】:2011-09-12 19:04:32 【问题描述】:

我正在试用MongoEngine,这是一个供 Python 与 MongoDB 一起使用的 DRM 库。我可以从网站上定义一个像这个例子这样的模型:

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。这是一个很好的场景吗?我只想让将使用该应用程序的人定义自己的模型,而无需深入研究代码。任何关于如何创建动态模型的想法都值得赞赏

【问题讨论】:

【参考方案1】:

如果您要使用 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")

【讨论】:

以上是关于即时从 YAML/JSON 创建模型的主要内容,如果未能解决你的问题,请参考以下文章

即时配送的订单分配策略:从建模和优化-笔记

从两个不同的模型在 Django 中建模收藏夹

UML建模—EA创建类图

游戏模型:场景布局及场景建模

使用 Visual Studio 建模项目创建 C# 事件

《Entity Framework 6 Recipes》翻译系列 -----第二章 实体数据建模基础之创建一个简单的模型 (转)