基于python的web应用和/或api的对象模型映射器

OMM的Python项目详细描述


对象模型映射器

CircleCIMaintainabilityTest CoveragePyPI version

这是什么?

此脚本允许平坦/凹凸模型深度。

我为什么做这个?

当我使用MongoEngine时,我需要这样设计模型:

importmongoengineasdbclassRecentPrevAmount(db.EmbeddedDocument):recent=db.FloatField()prev=db.FloatField()classAssetInfo(db.Document):assets=db.EmbeddedDocumentField(RecentPrevAmount)cash=db.EmbeddedDocumentField(RecentPrevAmount)receivable=db.EmbeddedDocumentField(RecentPrevAmount)revenue=db.EmbeddedDocumentField(RecentPrevAmount)cogs=db.EmbeddedDocumentField(RecentPrevAmount)

并按上述顺序创建restapi,没有“undefiend property”错误, 需要创建5个CRUD资源:

  • [GET, POST, PUT, DELETE] /assets
  • [GET, POST, PUT, DELETE] /cash
  • [GET, POST, PUT, DELETE] /receivable
  • [GET, POST, PUT, DELETE] /revenue
  • [GET, POST, PUT, DELETE] /cogs

对于每个资源,输出/输入如下所示:

{"recent":10.0,"prev":14.0}

这意味着,需要发送大量请求来归档资产信息和 它可能有前端慢。为了避免这个问题,要发送的请求数 应尽量减少。理想的资源是 以下格式:

{"assets_recent":10.0,"assets_prev":11.0,"cash_recent":12.0,"receivable_prev":13.0,"revenue_recent":14.0,"cogs_prev":15.0}

当然,以上对公共api是不好的 (在公共api上,recent和prev应该嵌入到一个字段中) 但是上面的结构减少了请求的数量。

如何使用

我想你需要的是示例代码而不是文档。

展开模型

#!/usr/bin/env python# coding=utf-8"""Example code.Note that this is just an example."""importmongoengineasdbimportommimportwtforms.formsasformsimportwtforms.fieldsasfldimportwtforms.validatorsasvldfrom..apiimportapi,render,login_only# First, let's define the target models as usual.classAddress(db.EmbeddedDocument):street=db.ListField(db.StringField,required=True)city=db.StringField(required=True)state=db.StringField(required=True)country=db.StringField(required=True)classUser(db.Document):email=EmailField(primary_key=True)first_name=StringField(required=True)last_name=StringField(required=True)address=db.EmbeddedDocument(Address,required=True)@propertydeffull_name(self):return(" ").join([self.first_name,self.last_name])@full_name.setterdeffull_name(self,value):try:(self.first_name,self.last_name)=value.split(" ")exceptValueError:pass# Then, define the map.classUserMapper(omm.Mapper):# Note that set_cast can be non-list, i.e. str. However, in this case,# we use User because the root object type is User.fullname=omm.MapField("full_name",set_cast=[User,str])email=omm.MapField("email",set_cast=[User,str])# For third element should be list or any class that inherits list because# the target is typed as list.street1=omm.MapField("address.street[0]",set_cast=[User,Address,list,str])street2=omm.MapField("address.street[1]",set_cast=[User,Address,list,str])# Note that dot-notation is used to specify the member.city=omm.MapField("address.city",set_cast=[User,Address,str])state=omm.MapField("address.state",set_cast=[User,Address,str])country=omm.MapField("address.country",set_cast=[User,Address,str])classUserForm(forms.Form):fullname=fld.StringField(validators=[vld.DataRequired()])email=fld.StringField(validators=[vld.Email()])street1=fld.StringField(validators=[vld.DataRequired()])street2=fld.StringField(validators=[vld.Optional()])city=fld.StringField(validators=[vld.DataRequired()])state=fld.StringField(validators=[vld.DataRequired()])country=fld.StringField(validators=[vld.DataRequired()])classUserController(object):# User APIdefget(self,id):# GET request.user=User.objects()mapper=UserMapper(user)returnrender(mapper.to_json(),mimetype="application/json")defpost(self):# POST request.form=UserForm(api.request.json())ifnotform.validate():returnrender(api.jsonify(form.errors),mimetype="application/json",code=417)mapper=UserMapper()form.populate_obj(mapper)mapper.connected_object.save()@login_onlydefput(self,uid):# PUT request.form=UserForm(api.request.json())ifnotform.validate():returnrender(api.jsonify(form.errors),mimetype="application/json",code=417)mapper=UserMapper(User.objects(uid))form.populate_obj(mapper)mapper.connected_object.save()api.register(UserController)

增加模型深度

目前,我正在考虑(并设计)访问多个模型的方法 通过地图绘制者。不幸的是,这些功能还没有实现。

其他功能

阅读code

许可证(麻省理工学院许可证)

版权所有(c)2016 Hiroaki Yamamoto

兹免费准许任何人取得副本 本软件和相关文档文件(“软件”)的 在软件中不受限制,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或出售 软件的副本,并允许软件的用户 在满足以下条件的情况下,可以这样做:

上述版权公告及本许可公告须包括在 软件的拷贝或大部分。

本软件按“原样”提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 适合特定目的和不侵权。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在合同诉讼、侵权诉讼或其他诉讼中, 不属于或与本软件有关,或使用或与本软件的其他交易有关。 软件。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java正在寻找Java8中的内置函数以忽略异常   javascript JQuery更改Div的颜色   java PostgreSQL使用JDBC写入inet列   java为什么体重指数计算结果不正确?   java禁用linux中的log4j控制台日志记录   java我可以让我的JMS主题在新订阅者连接时通知发布者(使用ActiveMQ)   基于三个浮点输入的java过滤器JTable?   Java OpenGL/LWJGL体素纹理   在SpringBoot java应用程序中,有没有一种方法可以通过不同的机器使用hostIP作为主机远程连接到redis服务器   java Struts 2 s:提交按钮语法以在映射中设置值   java源代码:setDomainEnv。windows 7中的cmd文件   缺少货币计算java的返回语句   JavaHibernate没有注意到从其他源进行的数据库更新   无法在OpenCV/Java中生成负矩阵   Java不做循环   java无法使用类对象写入文件ArrayList   jpa使用数组作为调用Java的存储过程的输入   java使用文件提供程序检索内容Uri失败   需要java程序来创建方法模板