Pydantic serialisation 中文文档(完整版)
前言
初衷:在学习的时候发现 Tortoise-ORM FastAPI integration 官方文档缺中文版,翻阅英文文档效率低,萌生翻译想法。
本系列旨在原汁原味的翻译 Tortoise-ORM FastAPI integration 官方文档,帮助英语不好的小伙伴快速学习使用方法。
翻译不易,禁止商业用途,转载请标明出处(本人博客观看效果更佳:torna.top
),具体情况或反馈请联系博主绿泡泡l927171598
。
如果觉得翻译不错,欢迎在文章底部请博主喝杯奶茶,您的鼓励就是俺最大的动力!😄
简介
Tortoise ORM
提供 Pydantic
插件,可以从 Tortoise Models
生成 Pydantic
模型,然后提供辅助函数来序列化该模型及其相关对象。
我们目前仅支持为序列化生成 Pydantic
对象,目前尚不支持反序列化。
教程
基础用法
这里我们将介绍:
- 从 Tortoise 模型创建一个 Pydantic 模型
- 使用文档字符串和文档注释
- 评估生成的 schema
- 使用
.model_dump()
和.model_dump_json()
函数进行简单序列化
让我们从一个基础的 Tortoise
模型开始:
from tortoise import fields
from tortoise.models import Model
class Tournament(Model):
"""
This references a Tournament
"""
id = fields.IntField(primary_key=True)
name = fields.CharField(max_length=100)
#: The date-time the Tournament record was created at
created_at = fields.DatetimeField(auto_now_add=True)
要从中创建一个 Pydantic
模型,就需要调用该函数:tortoise.contrib.pydantic.creator.pydantic_model_creator()
from tortoise.contrib.pydantic import pydantic_model_creator
Tournament_Pydantic = pydantic_model_creator(Tournament)
现在我们有了一个 Pydantic
模型,可以用来定义 schema
数据模式并实现序列化功能。
如下代码是 Tournament_Pydantic
模型的 JSON-Schema :
>>> print(Tournament_Pydantic.schema())
{
'title': 'Tournament',
'description': 'This references a Tournament',
'type': 'object',
'properties': {
'id': {
'title': 'Id',
'type': 'integer'
},
'name': {
'title': 'Name',
'type': 'string'
},
'created_at': {
'title': 'Created At',
'description': 'The date-time the Tournament record was created at',
'type': 'string',
'format': 'date-time'
}
}
}
注意现在关于 Schema
的描述内包含了类的文档字符串和文档注释 #:
。
序列化对象,只需(在异步环境中)进行以下操作:
tournament = await Tournament.create(name="New Tournament")
tourpy = await Tournament_Pydantic.from_tortoise_orm(tournament)
现在我们获取数据库内容只需要使用常规的 Pydantic-object 方法, 例如 .model_dump() 或 .model_dump_json()
>>> print(tourpy.model_dump())
{
'id': 1,
'name': 'New Tournament',
'created_at': datetime.datetime(2020, 3, 1, 20, 28, 9, 346808)
}
>>> print(tourpy.model_dump_json())
{
"id": 1,
"name": "New Tournament",
"created_at": "2020-03-01T20:28:09.346808"
}
查询集与列表
这里我们将介绍:
- 创建一个列表模型来序列化一个查询集
- 遵循默认的排序方式
from tortoise import fields
from tortoise.models import Model
class Tournament(Model):
"""
This references a Tournament
"""
id = fields.IntField(primary_key=True)
name = fields.CharField(max_length=100)
#: The date-time the Tournament record was created at
created_at = fields.DatetimeField(auto_now_add=True)
class Meta:
# Define the default ordering
# the pydantic serialiser will use this to order the results
ordering = ["name"]
要从中创建一个 Pydantic
列表模型,就需要调用该函数:tortoise.contrib.pydantic.creator.pydantic_queryset_creator()
from tortoise.contrib.pydantic import pydantic_queryset_creator
Tournament_Pydantic_List = pydantic_queryset_creator(Tournament)
现在我们有一个 Pydantic
模型,可以用来定义 schema
数据模式并实现序列化功能。
如下代码是 Tournament_Pydantic_List
模型的 JSON-Schema :
>>> print(Tournament_Pydantic_List.schema())
{
'title': 'Tournaments',
'description': 'This references a Tournament',
'type': 'array',
'items': {
'$ref': '#/definitions/Tournament'
},
'definitions': {
'Tournament': {
'title': 'Tournament',
'description': 'This references a Tournament',
'type': 'object',
'properties': {
'id': {
'title': 'Id',
'type': 'integer'
},
'name': {
'title': 'Name',
'type': 'string'
},
'created_at': {
'title': 'Created At',
'description': 'The date-time the Tournament record was created at',
'type': 'string',
'format': 'date-time'
}
}
}
}
}
注意现在 Tournament
不再是根节点了。取而代之的是一个简单的列表,即 Tournament_Pydantic_List
。
序列化对象,只需(在异步环境中)进行以下操作:
# Create objects
await Tournament.create(name="New Tournament")
await Tournament.create(name="Another")
await