从jsonschema构建Django REST框架API

djangorestframework-jsonschema的Python项目详细描述



djangorestframeworkjsonschema


概述

此包提供了一个管理命令,该命令生成 来自JSONSchema规范的Django REST框架解决方案。在

要求

  • Python(3.8+)
  • Django(3.0+)
  • Django Rest框架(3.11)
  • JSONSchema(3.2)
  • 金夹2号(2.11)

安装

使用pip安装。。。在

$ pip install djangorestframework-jsonschema

此应用程序需要将其包含在项目的INSTALLED_APPS中,它应该 在rest_framework和{}之后,这两个都是必需的, 但在你的项目具体细节之前。在

^{pr2}$

示例

在新的DRF应用程序example_app中将以下内容另存为schema.json

{"definitions":{"identifiers":{"properties":{"ISBN":{"type":"string","pattern":"[0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*"},"Dewey Decimal Classification":{"type":"string","pattern":"\\d{3}|\\d{3}\\.\\d+|[12456]--\\d+|3[ABC]?--\\d+"}}},"Book":{"properties":{"title":{"type":"string"},"other":{"$ref":"#/definitions/identifiers"},"genre":{"enum":["celebrity-nonsense","military-tat","other"]},"author":{"$ref":"#/definitions/Author"}}}},"properties":{"Book":{"$ref":"#/definitions/Book"},"Author":{"properties":{"name":{"type":"string"},"date_of_birth":{"type":"string","format":"date"}}}}}

现在快跑

$ python manage.py jsonschema2dj example_app

生产如下:

  • 在模型.py在
  • 在视图.py在
  • 在序列化程序.py在
  • 在网址.py在
  • 在过滤器.py在
  • 在管理员py在

这些文件是使用jinja模板使用合理的默认选项构建的 如果可能的话。预计用户将修改这些文件以适合其 需要。在

例如models.py将是:

classBook(models.Model):title=models.CharField(null=True,max_length=255)other=JSONField(validators=[JSONSchemaValidator({'$ref':'#/definitions/identifiers'},DEFINITIONS)])genre=models.CharField(null=True,max_length=25,choices=[('celebrity_nonsense','celebrity nonsense'),('military-tat','military-tat'),('other','other')])author=models.ForeignKey("Author",null=True,on_delete=models.CASCADE)classAuthor(models.Model):name=models.CharField(null=True,max_length=255)date_of_birth=models.DateField(null=True)

其目的是:

  • 任何了解JSONSchema的人都可以访问
  • 任何对Django有初步了解的人都可以扩展

规则

模型是位于schema.jsonproperties根级别的对象。在

模型的字段是其根级属性。在

这些定义可以不受限制地自由使用。在

有三种类型的字段:

简单字段

如果一个字段有一个jsonschema:type,它不是objectitems或者可以推断出这一点,然后将该字段映射到djngo字段 大约为:

  • “字符串”->;字符域
  • “整数”->;整数字段
  • “数字”->;小数字段
  • “布尔值”->;布尔字段

如果字段的名称是id,那么这将是主键。在

参考字段

如果一个字段有一个jsonschema:type,它是objectitems并且它引用了一个对象(模型),该对象(模型)的模式也在顶层定义 属性然后将其建模为与该对象(模型)的关系,如:

  • "$ref": "Model-X"->;一对一或一对多
  • "items": {"$ref": "Model-X"}->;多对一或多对多

注意,精确的基数只能通过比较 关系。如果只指定了一侧,则假定它是 一对多或多对多。在

json字段

最后,如果一个字段有一个jsonschema:type,即objectitems并且它引用的对象(模型)的模式不是 在顶层属性中定义,然后将其建模为jsons对象 就其本身而言,即:

  • “对象”->;JSONField

它的架构将由序列化程序实施。在

测试

$ ./runtests.py

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

推荐PyPI第三方库


热门话题
java随机填充2d数组   java运行时。getRuntime。带有长参数的exec(cmd)   java Minecraft无法放置自定义背景   java AChartEngine YAxis自定义标签区域边距和图表值为字符串?   泛型类的java类型安全错误   整数的java符号等价物。toBinaryString方法?   Java中数组列表的数组   java WebView应用程序在谷歌登录后显示空白屏幕   java从backback中删除特定片段   如果服务器不支持使用的协议,java JSSE是否实现回退?   java Sonarqube正在进行核心漏洞查找。如何解决   javajavax。jcr。UnsupportedPositionOperationException:testVersionable处的节点不可版本化   java在安卓中每隔X小时运行一次文件/函数,无需打开应用程序   java如何为磁盘持久性配置BigMemory?   java BufferWriter不转换383以上的整数   Java7交集类型:规范具体说明了什么?   Java:CollectionHow创建多列   java如何检测运算符的空白   java问题:在firebase中为导航栏中的第二个表单提交数据第一个表单工作正常。实际isse是连接Mainactivity中的另一个活动