从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
和{
示例
在新的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.json
的properties
根级别的对象。在
模型的字段是其根级属性。在
这些定义可以不受限制地自由使用。在
有三种类型的字段:
简单字段
如果一个字段有一个jsonschema:type
,它不是object
或
items
或者可以推断出这一点,然后将该字段映射到djngo字段
大约为:
- “字符串”->;字符域
- “整数”->;整数字段
- “数字”->;小数字段
- “布尔值”->;布尔字段
如果字段的名称是id
,那么这将是主键。在
参考字段
如果一个字段有一个jsonschema:type
,它是object
或
items
并且它引用了一个对象(模型),该对象(模型)的模式也在顶层定义
属性然后将其建模为与该对象(模型)的关系,如:
"$ref": "Model-X"
->;一对一或一对多"items": {"$ref": "Model-X"}
->;多对一或多对多
注意,精确的基数只能通过比较 关系。如果只指定了一侧,则假定它是 一对多或多对多。在
json字段
最后,如果一个字段有一个jsonschema:type
,即object
或
items
并且它引用的对象(模型)的模式不是
在顶层属性中定义,然后将其建模为jsons对象
就其本身而言,即:
- “对象”->;JSONField
它的架构将由序列化程序实施。在
测试
$ ./runtests.py
- 项目
标签: