Python 从json模式动态创建mongoengine类
我正在寻找一种在运行时采用json模式并动态创建mongoengine类的方法 例如: 下面是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
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的唯一转换器,输入时提供了“您的模式”,它将被转换为dictuser\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对象,将必要的变量传递给templaterender()
方法,该方法将在呈现模板时使用,并最终写入名为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等价物之间的转换。以及验证参数,如最小值和最大值等。