Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从json模式动态创建mongoengine类_Python_Json_Mongoengine_Jsonschema - Fatal编程技术网

Python 从json模式动态创建mongoengine类

Python 从json模式动态创建mongoengine类,python,json,mongoengine,jsonschema,Python,Json,Mongoengine,Jsonschema,我正在寻找一种在运行时采用json模式并动态创建mongoengine类的方法 例如: 下面是mongoengine类 class user(Document): _id = StringField(required=False) # mongodb id name = StringField(required=True) # user name email= StringField(required=False,regex="^[a-zA-Z0-9]*@myd

我正在寻找一种在运行时采用json模式并动态创建mongoengine类的方法

例如: 下面是mongoengine类

class user(Document):
     _id  = StringField(required=False) # mongodb id
     name = StringField(required=True)  # user name
     email= StringField(required=False,regex="^[a-zA-Z0-9]*@mydomain.com$")  # user email
将与从该架构生成的在运行时动态生成的类相同

{
"type":"object",
"properties":{
    "_id"      : {"type":"string"},
    "name"     : {"type":"string"},
    "email"    : {"pattern":"^[a-zA-Z0-9]*@mydomain.com$"}
    }
}

有什么建议吗?

您可以动态创建python类,如下所示:

user_属性={
“_id”:StringField(必需=False),#mongodb id
“名称”:StringField(必需=True),#用户名
“电子邮件”:StringField(必需=False,regex=“^[a-zA-Z0-9]*@mydomain.com$”,#用户电子邮件
}
用户=类型(“用户”,“文档”,“用户属性”)
剩下的是来自dict的唯一转换器,输入时提供了“您的模式”,它将被转换为dict
user\u属性

此外,这里还有一个类似的问题“”,它也会有所帮助。

模板引擎的功能可用于创建mongo类模板,该模板根据每个属性的类型填充类定义中的属性架构。然后,我们使用呈现此模板的简单中间脚本动态生成所需的Python类。 下面是一个说明这一概念的示例。我们从以下项目结构开始,它有一个名为Templates的示例父文件夹和三个文件:

Templates\
    - mongo_sample.schema.json
    - mongoclass_template.jinja
    - auto_mongo_class.py
让我们浏览这些文件:

1。mongo_sample.schema.json

这是文件。一致的架构有助于以后创建标准的Jinja模板:

{
  "type":"object",
  "required": ["name"],
  "properties":{
      "_id"      : {"type":"string"},
      "name"     : {"type":"string"},
      "email"    : {"pattern":"^[a-zA-Z0-9]*@mydomain.com$"}
    }
}
2。mongoclass_模板。jinja:

这是Mongo类的Jinja模板,最终将用于呈现所需的Python Mongo类。它使用了Jinja模板语言。这是本书的参考资料。在这里,我们所要做的就是创建一个模板,该模板涵盖所有“类型”情况以及“必需”和“regex”等参数。请注意,一致的模式非常重要:

from mongoengine import DynamicDocument, StringField, IntField

class Student(DynamicDocument):       
    {%- for prop, val in properties.items() %} 
    {%- if prop in required -%}
    {% set req = True %}
    {% else %}    
    {% set req = False %}
    {%- endif -%}
    {%- if val.pattern is defined -%}
    {% set patt = val.pattern %}    
    {% else %}
    {% set patt = None %} 
    {%- endif -%}  
    {%- if val.type == "string" -%}
    {{prop}} = StringField(required={{req}}, regex={{patt}})
    {%- elif val.type == "int" -%}
    {{prop}} = IntField(required={{req}})        
    {%- else -%} 
    {{prop}} = StringField(required={{req}}, regex="{{patt}}")       
    {%- endif -%}
    {%- endfor %}
    
3。auto\u mongo\u class.py:

此Python脚本通过上面的JSON模式进行解析以获取properties对象,将必要的变量传递给template
render()
方法,该方法将在呈现模板时使用,并最终写入名为
models.py
的Python文件,该文件是最终的Mongo类:

import json
from jinja2 import Template

with open(r"mongo_sample.schema.json", "r") as schema_json:
    schema_tree = json.load(schema_json)
properties = schema_tree["properties"]
required = schema_tree["required"]
template = Template(open(r"mongoclass_template.jinja").read()).render(properties=properties, \
    required=required)

with open("models.py", 'w') as file_:
    file_.write(template)
现在,让我们运行以下脚本:

python auto_mongo_class.py
名为
models.py
的新Python脚本将出现在项目文件夹中,其中包含以下内容:

from mongoengine import DynamicDocument, StringField, IntField

class Student(DynamicDocument):    
    
    _id = StringField(required=False, regex=None)
    
    name = StringField(required=True, regex=None)    
        
    email = StringField(required=False, regex="^[a-zA-Z0-9]*@mydomain.com$")

类还是某个类的对象?我想创建一个classAgree,这将非常有用。特别是对于任何使用多种语言并使用DB存储上下文之外的对象的生态系统(jsonschema可以是唯一的真实来源)。不,因为它没有使用JSON模式来创建文档类,正如问题所述。原始问题没有实际指定一个真实的示例可能没有帮助:(@101 author可以将
user\u properties
更改为他需要的任何模式。如果他从文件中读取,他只需执行
user\u properties=json.loads(文件内容)
。我只是向模型展示了如何提供这些。我不会在这里为他构建完整的框架,因为这是问答服务,不是自由职业者平台。那么还缺少什么(如果还有什么的话)?和mongoengine等价物之间的转换。以及验证参数,如最小值和最大值等。