fastapi项目中数据流转架构设计规范

news2025/5/18 15:44:11

一、数据库层设计

1.1 ORM模型定义

class SysUser(Base):
    __table_args__ = {
        "mysql_engine": "InnoDB",
        "comment": "用户表"
    }

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment="用户ID")
    username: Mapped[str] = mapped_column(String(50), unique=True, nullable=False, comment="用户名")
    password: Mapped[str] = mapped_column(String(100), nullable=False, comment="密码")
    nickname: Mapped[str | None] = mapped_column(String(50), comment="昵称")
    avatar: Mapped[str | None] = mapped_column(String(255), comment="头像")
    email: Mapped[str | None] = mapped_column(String(100), comment="邮箱")
    phone: Mapped[str | None] = mapped_column(String(20), comment="手机号")
    ding_token: Mapped[str | None] = mapped_column(String(255), comment="钉钉Token")
    ding_key: Mapped[str | None] = mapped_column(String(255), comment="钉钉key")
    status: Mapped[bool] = mapped_column(Boolean, default=True, comment="状态(0:禁用,1:启用)")
    dept_id: Mapped[int | None] = mapped_column(Integer, comment="部门ID")
    remark: Mapped[str | None] = mapped_column(String(255), comment="备注")
    create_time: Mapped[datetime] = mapped_column(
        DateTime,
        nullable=False,
        server_default=text("CURRENT_TIMESTAMP"),
        comment="创建时间"
    )
    update_time: Mapped[datetime] = mapped_column(
        DateTime,
        nullable=False,
        server_default=text("CURRENT_TIMESTAMP"),
        onupdate=text("CURRENT_TIMESTAMP"),
        comment="更新时间"
    )

    def __repr__(self):
        return f"<User(id={self.id}, username={self.username})>"

二、数据传输层设计

2.1 输入DTO规范

基础校验DTO

class UserBaseDTO(BaseModel):
    username: str = Field(
        ...,
        min_length=3,
        max_length=50,
        alias="userName",
        pattern=r"^[a-zA-Z0-9_]+$",
        description="用户名需包含3-50个字符(字母/数字/下划线)"
    )
    password: str = Field(..., min_length=6, description="密码")
    nickname: Optional[str] = Field(None, alias="nickName", max_length=50, description="昵称")
    avatar: Optional[str] = Field(None, max_length=255, description="头像")
    email: Optional[str] = Field(None, max_length=100, description="邮箱")
    phone: Optional[str] = Field(None, max_length=20, description="手机号")
    ding_token: Optional[str] = Field(None, alias="dingToken", max_length=255, description="钉钉Token")
    ding_key: Optional[str] = Field(None, alias="dingKey", max_length=255, description="钉钉Key")
    status: Optional[int] = Field(1, description="状态(0:禁用,1:启用)")
    dept_id: Optional[int] = Field(None, alias="deptId", description="部门ID")
    remark: Optional[str] = Field(None, max_length=255, description="备注")
    create_time: Optional[datetime] = Field(None, alias="createTime", description="创建时间")

    class Config:
        extra = "ignore"  # 禁止额外字段(默认)
        from_attributes = True  # 允许ORM对象转换(旧版alias: orm_mode)
        allow_population_by_field_name = True  # 允许别名/字段名双模式

其他专用DTO

class UserUpdateDTO(UserBaseDTO):
    id: Optional[int] = Field(...)
    update_time: Optional[datetime] = Field(None, alias="updateTime")
    role_ids: Optional[List[int]] = Field(None, alias="roleIds", description="角色ID")
    password: Optional[str] = Field(None, exclude=True)  # 改为可选

    class Config:
        extra = "ignore"
        from_attributes = True
        allow_population_by_field_name = True


class UserConditionDTO(PageDTO):
    username: Optional[str] = Field(None, alias="userName")
    nickname: Optional[str] = Field(None, alias="nickName")
    status: Optional[int] = None
    dept_id: Optional[int] = Field(None, alias="deptId")

    class Config:
        extra = "ignore"
        from_attributes = True
        allow_population_by_field_name = True

2.2 输出VO规范

基础VO模型

class SysUserBase(BaseModel):
    userName: str = Field(None, alias="username")
    nickName: str | None = Field(None, alias="nickname")
    email: str | None = None
    phone: str | None = None
    dingToken: str | None = Field(None, alias="ding_token")
    dingKey: str | None = Field(None, alias="ding_key")
    status: int = 1
    remark: str | None = None
    deptId: int | None = Field(None, alias="dept_id")

    class Config:
        from_attributes = True
        populate_by_name = True  # 启动别名

列表扩展VO

class UserCreate(SysUserBase):
    password: str


class UserUpdate(SysUserBase):
    password: str | None = None


class UserVO(SysUserBase):
    id: int
    avatar: str | None = None
    createTime: datetime | None = Field(None, alias="create_time")
    updateTime: datetime | None = Field(None, alias="update_time")

    class Config:
        from_attributes = True
        populate_by_name = True  # 添加这个配置


class UserListVo(UserVO):
    deptName: str | None = Field(None, alias="dept_name")
    roleNames: str | None = Field(None, alias="role_names")

    class Config:
        from_attributes = True
        populate_by_name = True  # 添加这个配置

三、转换关系矩阵

流程图构思

  1. ‌数据库层‌

    • ‌InnoDB存储引擎‌:显示InnoDB图标,表示数据表do是使用InnoDB存储的。
    • ‌数据表do‌:显示一个表格图标,旁边标注表名do,并列出主要字段(如idusernamepasswordcreate_time等)。
  2. ‌数据访问层(DAL)‌

    • ‌ORM框架‌:显示一个ORM框架的图标(如SQLAlchemy、Django ORM等),表示使用ORM来抽象数据库操作。
    • ‌数据模型‌:显示一个类图,代表与数据表do对应的ORM模型(如SysUser类)。
  3. ‌业务逻辑层(BLL)‌

    • ‌服务/业务方法‌:显示一个方法或服务的图标,表示在这里进行数据转换和业务逻辑处理。
    • ‌DTO/VO转换‌:显示数据在DTO(数据传输对象)和VO(视图对象)之间的转换过程。
  4. ‌表示层(UI/API)‌

    • ‌前端/API接口‌:显示一个前端页面或API接口的图标,表示数据最终展示给用户或通过API提供给其他服务。

四、config扩展一级pydantic V2.0建议

在Pydantic 2.0+版本中,配置方式已从传统的class Config迁移至model_config = ConfigDict()形式,以下是核心配置参数及使用规范:

示例:

class UserModel(BaseModel):
    name: str
    age: int

    model_config = ConfigDict(
        extra='forbid',
        frozen=True
    )

 核心配置参数分类

字段处理控制
参数作用示例值
extra控制额外字段处理策略'forbid' '禁止额外字段'
'allow' '允许保留额外字段'
'ignore'‘静默忽略额外字段’
populate_by_name允许通过字段名或别名填充数据True/False
alias_generator全局字段别名生成函数lambda x: x.upper()
类型验证配置
参数作用
arbitrary_types_allowed是否允许非Pydantic原生类型(如自定义类)
strict启用严格模式(禁用类型自动转换)
revalidate_instances每次访问字段时重新验证数据
序列化与文档
参数作用
json_encoders自定义类型的JSON序列化方法(如{datetime: lambda v: v.timestamp()}
json_schema_extra扩展OpenAPI Schema(如添加example字段)
ORM集成
参数作用
from_attributes允许从ORM对象属性加载数据(旧版orm_mode的替代)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NHANES指标推荐:FMI

文章题目&#xff1a;Exploring the relationship between fat mass index and metabolic syndrome among cancer patients in the U.S: An NHANES analysis DOI&#xff1a;10.1038/s41598-025-90792-9 中文标题&#xff1a;探索美国癌症患者脂肪量指数与代谢综合征之间的关系…

【JDBC】JDBC常见错误处理方法及驱动的加载

MySQL8中数据库连接的四个参数有两个发生了变化 String driver "com.mysql.cj.jdbc.Driver"; String url "jdbc:mysql://127.0.0.1:3306/mydb?useSSLfalse&useUnicodetrue&characterEncodingutf8&serverTimezoneAsia/Shanghai"; 或者Strin…

车载以太网驱动智能化:域控架构设计与开发实践

title: 车载以太网驱动专用车智能化&#xff1a;域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言&#xff1a;专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…

如何利用技术手段提升小学数学练习效率

在日常辅导孩子数学作业的过程中&#xff0c;我发现了一款比较实用的练习题生成工具。这个工具的安装包仅1.8MB大小&#xff0c;但基本能满足小学阶段的数学练习需求。 主要功能特点&#xff1a; 参数化出题 可自由设置数字范围&#xff08;如10以内、100以内&#xff09; 支…

BGP路由策略 基础实验

要求: 1.使用Preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2.用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保R1通过R2到达192.168.1.0/24 …

第9讲、深入理解Scaled Dot-Product Attention

Scaled Dot-Product Attention是Transformer架构的核心组件&#xff0c;也是现代深度学习中最重要的注意力机制之一。本文将从原理、实现和应用三个方面深入剖析这一机制。 1. 基本原理 Scaled Dot-Product Attention的本质是一种加权求和机制&#xff0c;通过计算查询(Query…

双向长短期记忆网络-BiLSTM

5月14日复盘 二、BiLSTM 1. 概述 双向长短期记忆网络&#xff08;Bi-directional Long Short-Term Memory&#xff0c;BiLSTM&#xff09;是一种扩展自长短期记忆网络&#xff08;LSTM&#xff09;的结构&#xff0c;旨在解决传统 LSTM 模型只能考虑到过去信息的问题。BiLST…

MySQL UPDATE 执行流程全解析

引言 当你在 MySQL 中执行一条 UPDATE 语句时&#xff0c;背后隐藏着一套精密的协作机制。从解析器到存储引擎&#xff0c;从锁管理到 WAL 日志&#xff0c;每个环节都直接影响数据一致性和性能。 本文将通过 Mermaid 流程图 和 时序图&#xff0c;完整还原 UPDATE 语句的执行…

亚马逊云科技:开启数字化转型的无限可能

在数字技术蓬勃发展的今天&#xff0c;云计算早已突破单纯技术工具的范畴&#xff0c;成为驱动企业创新、引领行业变革的核心力量。亚马逊云科技凭借前瞻性的战略布局与持续的技术深耕&#xff0c;在全球云计算领域树立起行业标杆&#xff0c;为企业和个人用户提供全方位、高品…

【实测有效】Edge浏览器打开部分pdf文件显示空白

问题现象 Edge浏览器打开部分pdf文件显示空白或显示异常。 ​​​​​​​ ​​​​​​​ ​​​​​​​ 问题原因 部分pdf文件与edge浏览器存在兼容性问题&#xff0c;打开显示异常。 解决办法 法1&#xff1a;修改edge配置 打开edge浏览器&#x…

RJ连接器的未来:它还会是网络连接的主流标准吗?

RJ连接器作为以太网接口的代表&#xff0c;自20世纪以来在计算机网络、通信设备、安防系统等领域中占据了核心地位。以RJ45为代表的RJ连接器&#xff0c;凭借其结构稳定、信号传输可靠、成本低廉等优势&#xff0c;在有线网络布线领域被广泛采用。然而&#xff0c;在无线网络不…

Redis持久化机制详解:保障数据安全的关键策略

在现代应用开发中&#xff0c;Redis作为高性能的内存数据库被广泛使用。然而&#xff0c;内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制&#xff0c;包括RDB、AOF以及混合持久化模式&#xff0c;帮助开发者根据业务需求选择最适合的持…

DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案

DeepSeek 作为当前最热门的开源大模型之一&#xff0c;其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中&#xff0c;无论是本地运行还是云端服务&#xff0c;用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题&#xff0c;提…

嵌入式培训之数据结构学习(五)栈与队列

一、栈 &#xff08;一&#xff09;栈的基本概念 1、栈的定义&#xff1a; 注&#xff1a;线性表中的栈在堆区&#xff08;因为是malloc来的&#xff09;&#xff1b;系统中的栈区存储局部变量、函数形参、函数返回值地址。 2、栈顶和栈底&#xff1a; 允许插入和删除的一端…

RabbitMQ--进阶篇

RabbitMQ 客户端整合Spring Boot 添加相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 编写配置文件&#xff0c;配置RabbitMQ的服务信息 spri…

Android Studio报错Cannot parse result path string:

前言 最近在写个小Demo&#xff0c;参考郭霖的《第一行代码》&#xff0c;学习DrawerLayout和NavigationView&#xff0c;不知咋地&#xff0c;突然报错Cannot parse result path string:xxxxxxxxxxxxx 反正百度&#xff0c;问ai都找不到答案&#xff0c;报错信息是完全看不懂…

关于网站提交搜索引擎

发布于Eucalyptus-blog 一、前言 将网站提交给搜索引擎是为了让搜索引擎更早地了解、索引和显示您的网站内容。以下是一些提交网站给搜索引擎的理由&#xff1a; 提高可见性&#xff1a;通过将您的网站提交给搜索引擎&#xff0c;可以提高您的网站在搜索结果中出现的机会。当用…

基于QT(C++)OOP 实现(界面)酒店预订与管理系统

酒店预订与管理系统 1 系统功能设计 酒店预订是旅游出行的重要环节&#xff0c;而酒店预订与管理系统中的管理与信息透明是酒店预订业务的关键问题所在&#xff0c;能够方便地查询酒店信息进行付款退款以及用户之间的交流对于酒店预订行业提高服务质量具有重要的意义。 针对…

机械元件杂散光难以把控?OAS 软件案例深度解析

机械元件的杂散光分析 简介 在光学系统设计与工程实践中&#xff0c;机械元件的杂散光问题对系统性能有着不容忽视的影响。杂散光会降低光学系统的信噪比、图像对比度&#xff0c;甚至导致系统功能失效。因此&#xff0c;准确分析机械元件杂散光并采取有效抑制措施&#xff0c…

游戏引擎学习第289天:将视觉表现与实体类型解耦

回顾并为今天的工作设定基调 我们正在继续昨天对代码所做的改动。我们已经完成了“脑代码&#xff08;brain code&#xff09;”的概念&#xff0c;它本质上是一种为实体构建的自组织控制器结构。现在我们要做的是把旧的控制逻辑迁移到这个新的结构中&#xff0c;并进一步测试…