Pydantic serialisation 中文文档(完整版)

Pydantic serialisation 中文文档(完整版)

前言

初衷:在学习的时候发现 Tortoise-ORM FastAPI integration 官方文档缺中文版,翻阅英文文档效率低,萌生翻译想法。
本系列旨在原汁原味的翻译 Tortoise-ORM FastAPI integration 官方文档,帮助英语不好的小伙伴快速学习使用方法。
翻译不易,禁止商业用途,转载请标明出处(本人博客观看效果更佳:torna.top),具体情况或反馈请联系博主绿泡泡l927171598
如果觉得翻译不错,欢迎在文章底部请博主喝杯奶茶,您的鼓励就是俺最大的动力!😄

简介

Tortoise ORM 提供 Pydantic 插件,可以从 Tortoise Models 生成 Pydantic 模型,然后提供辅助函数来序列化该模型及其相关对象。

我们目前仅支持为序列化生成 Pydantic 对象,目前尚不支持反序列化。

具体参考Pydantic Examples

教程

基础用法

这里我们将介绍:

  • 从 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fender的web学习路程

蟹蟹你的奶茶😘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值