Pydantic 模型

本文將詳細介紹 Pydantic 模型BaseModel 的核心概念,并通過實際代碼示例如何從零開始編寫自己的 Pydantic 模型。


1. Pydantic 是什么?

Pydantic 是一個 Python 庫,主要用于:

  • 數據驗證:確保輸入數據符合預期的類型和約束。
  • 數據解析:將 JSON、字典等原始數據轉換為 Python 對象。
  • 文檔生成:自動生成 API 文檔(如 Swagger/OpenAPI)。
  • 配置管理:安全地加載環境變量或配置文件。

2. BaseModel:所有模型的基類

Pydantic 的所有模型都繼承自 BaseModel。它提供了核心功能:

  • 自動驗證字段類型。
  • 支持默認值和可選字段。
  • 生成 JSON Schema(用于 API 文檔)。

基礎示例

from pydantic import BaseModelclass User(BaseModel):name: strage: int# 使用字典初始化
user_data = {"name": "Alice", "age": 25}
user = User(**user_data)  # 自動驗證字段類型print(user.name)  # 輸出: Alice
print(user.age)   # 輸出: 25

3. 如何編寫自己的 Pydantic 模型?

(1) 定義字段類型

Pydantic 支持 Python 原生類型和復雜類型:

from typing import Optional, List
from datetime import datetime
import uuidclass Product(BaseModel):id: uuid.UUID                  # UUID 類型name: str                      # 必填字符串price: float                   # 浮點數tags: List[str]                # 字符串列表created_at: datetime           # 日期時間discount: Optional[float] = None  # 可選字段

(2) 添加字段約束

使用 Field 定義更復雜的規則:

from pydantic import BaseModel, Fieldclass User(BaseModel):username: str = Field(..., min_length=3, max_length=20)  # 必填,長度3-20email: str = Field(..., regex=r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")age: int = Field(ge=18, description="必須成年")  # 年齡 ≥ 18

(3) 自定義驗證邏輯

通過 @validator 添加自定義驗證:

from pydantic import validatorclass Payment(BaseModel):amount: floatcurrency: str@validator("amount")def amount_must_be_positive(cls, v):if v <= 0:raise ValueError("金額必須大于0")return v@validator("currency")def currency_must_be_valid(cls, v):if v not in ["USD", "EUR", "JPY"]:raise ValueError("無效的貨幣類型")return v

(4) 嵌套模型

模型可以嵌套其他模型:

class Address(BaseModel):city: strstreet: strclass Person(BaseModel):name: straddress: Address  # 嵌套模型# 使用示例
data = {"name": "Bob","address": {"city": "New York", "street": "5th Ave"}
}
person = Person(**data)

4. 高級用法

(1) 配置模型行為

通過 Config 類自定義模型行為:

class ConfigExample(BaseModel):name: strclass Config:anystr_strip_whitespace = True  # 自動去除字符串兩端空格allow_population_by_field_name = True  # 允許用別名初始化extra = "forbid"  # 禁止額外字段

(2) 生成 JSON Schema

Pydantic 自動為模型生成 JSON Schema:

print(User.schema_json(indent=2))

輸出:

{"title": "User","type": "object","properties": {"username": {"type": "string","minLength": 3,"maxLength": 20},"email": {"type": "string","pattern": "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"},"age": {"type": "integer","minimum": 18,"description": "必須成年"}},"required": ["username", "email", "age"]
}

(3) 與環境變量集成

從環境變量加載配置:

from pydantic import BaseSettingsclass Settings(BaseSettings):api_key: strdebug: bool = Falseclass Config:env_file = ".env"  # 從.env文件加載settings = Settings()  # 自動讀取環境變量

5. 完整示例:用戶注冊 API 模型

from pydantic import BaseModel, Field, EmailStr, validator
from typing import Optional
from datetime import datetimeclass UserRegister(BaseModel):username: str = Field(..., min_length=3, max_length=20)email: EmailStr  # 專門驗證郵箱格式的類型password: str = Field(..., min_length=8)birth_date: Optional[datetime] = Nonereferral_code: Optional[str] = Field(None, max_length=10)@validator("password")def password_must_contain_special_char(cls, v):if not any(c in "!@#$%^&*" for c in v):raise ValueError("密碼必須包含特殊字符")return v# 使用示例
user_data = {"username": "alice123","email": "alice@example.com","password": "secure!123"
}
user = UserRegister(**user_data)  # 自動驗證

6. 常見問題解答

Q1:Pydantic 和 Dataclasses 有什么區別?

  • Pydantic:專注于數據驗證和解析,支持復雜約束(如正則、自定義驗證)。
  • Dataclasses:僅生成 __init____repr__,無驗證功能。

Q2:如何處理未知字段?

通過 Config 控制:

class Config:extra = "allow"   # 允許額外字段(默認)extra = "forbid"  # 禁止額外字段extra = "ignore"  # 忽略額外字段

Q3:性能如何?

Pydantic 在首次運行時會生成驗證邏輯的優化代碼,后續調用速度接近原生 Python。


總結

功能實現方式
基礎字段定義name: str
字段約束Field(..., min_length=3)
自定義驗證@validator 裝飾器
嵌套模型直接嵌套其他 BaseModel
環境變量集成繼承 BaseSettings + Config
生成 API 文檔自動通過 schema_json() 或 FastAPI 集成

通過 Pydantic,你可以用極少的代碼實現強大的數據驗證和轉換邏輯,非常適合 API 開發、配置管理和數據處理場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86358.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Unity智能模型系列】MediaPipeUnityPlugin 實現人臉數據獲取

目錄 一、MediaPipeUnity 簡介 二、MediaPipeUnity 的核心組成 1. Graph 構建系統 2. 解決方案類(Solution) 3. 解釋注釋Annotation 系統 三、MediaPipeUnity 的典型使用流程 四、典型示例解析 1、案例 Face Detection圖形人臉檢測 2、案例 Face Detection圖形人臉檢…

iOS App 上架步驟解析:適合資源有限團隊的上架流程與注意事項

對于不少創業型或初創階段的開發團隊來說&#xff0c;人員配置緊湊、設備有限是常態。在這種背景下&#xff0c;完成一次合規、高效的iOS應用發布往往不是技術難點&#xff0c;而是流程協同與資源調配的問題。 我們是一支5人團隊&#xff0c;開發一款社交類工具型App&#xff…

Redis雪崩、穿透、擊穿原理及解決方案

以下是 Redis 緩存穿透、擊穿與雪崩的原理及解決方案的深度解析&#xff0c;結合工業級實踐整理&#xff1a; &#x1f50d; ?一、問題原理與區別? ?問題類型??觸發條件??核心特征??危害??緩存穿透?查詢?不存在的數據?繞過緩存直擊數據庫&#xff0c;導致無效查…

DFX 動態重構的概念和實現

DFX 動態重構的概念和實現 背景介紹 本文內容當前僅限于XILINX或者和XILINX具有相同結構的FPGA器件。 FPGA 技術提供了在現場進行編程和重新編程的靈活性&#xff0c;而無需通過重新制造流程來實現設計修改。動態功能交換&#xff08;Dynamic Function eXchange, DFX&#x…

hutool 導出數據報錯:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException

Excel 導出報錯 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/core.xml failed to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marsh…

【學習】win 本地部署qwen3

這里寫自定義目錄標題 環境搭建下載Ollama安裝olama修改模型下載位置&#xff08;可以不設置&#xff09;通過ollama下載/啟動模型常用命令其他 環境搭建 下載Ollama 安裝olama 默認安裝位置是c盤 安裝到指定位置使用以下命令 OllamaSetup.exe /DIR"d:\Ollama"修改…

python的__init__.py

在此之前先確認一個概念是否弄清 模塊命名空間 1. 目錄結構 假設你有以下結構&#xff1a; testpkg/__init__.pyfool.pymaybe.py內容如下&#xff1a; fool.py # testpkg/fool.py class Fool:passmaybe.py # testpkg/maybe.py class Maybe:pass__init__.py &#xff08…

四核 A53+工業級存儲:移遠 SC200L 與 pSLC SD NAND 如何重構 T-BOX 性能邊界?

博客目錄 一、移遠 SC200L&#xff1a;T-BOX 的 “智慧大腦”二、米客方德 MKDN064GIL-ZA T-BOX&#xff1a;數據安全的堅固堡壘三、深度協同&#xff1a;拓展 T-BOX 應用邊界 在車聯網浪潮席卷而來的當下&#xff0c;T-BOX 作為汽車與外界交互的核心樞紐&#xff0c;其性能優劣…

JavaEE-統一功能處理

攔截器 實現強制登錄的功能, 后端程序根據Session來判斷??是否登錄, 但是實現?法是?較?煩的 需要修改每個接?的處理邏輯 需要修改每個接?的返回結果 接?定義修改, 前端代碼也需要跟著修改 有沒有更簡單的辦法, 統?攔截所有的請求, 并進?Session校驗呢, 這?我們學…

vscode運行c++文件和插件的方法

1.運行c文件全過程 VSCode運行C全教程-CSDN博客 按照以上的操作即可完成正常的配置流程。但是在運行我的文件時&#xff0c;總是出現終端和輸出混亂的情況&#xff0c;我想要在終端中進行輸入輸出的話&#xff0c;需要加一個改動&#xff1a;設置--輸入Run In Terminal--勾選…

利用云效實現自動化部署gitee倉庫中的項目

本文主要介紹如何利用云效 實現Node項目&#xff08;vue/react....&#xff09;自動化部署 1.準備工作 Git 倉庫【Gitee】 云服務器【華為云】 你的項目 2. 創建目錄 服務器上創建兩個目錄 一個專門用來放壓縮包&#xff1a; /home/www/dist &#xff08;aaa.tgz bbb.tgz&am…

Flink SourceFunction深度解析:數據輸入的起點與奧秘

在Flink的數據處理流程中&#xff0c;StreamGraph構建起了作業執行的邏輯框架&#xff0c;而數據的源頭則始于SourceFunction。作為Flink數據輸入的關鍵組件&#xff0c;SourceFunction負責從外部數據源讀取數據&#xff0c;并將其轉換為Flink作業能夠處理的格式。深入理解Sour…

LabVIEW 共享變量通訊方式

在LabVIEW 開發中&#xff0c;共享變量&#xff08;SharedVariable&#xff09;作為實現數據實時交換的關鍵技術&#xff0c;廣泛應用于 LabVIEW、PLC 編程、分布式 SCADA 系統等領域。解析主流共享變量通訊機制的技術原理、性能特性及工程實踐中的選型策略。? 一、Network -P…

Angular進階之十二:Chrome DevTools+Angular實戰診斷指南

引言 最近有一個工單是說用戶在使用我們的系統的時候&#xff0c;如果使用某個頁面的次數多了以后瀏覽器就開始變慢甚至卡死崩潰掉。這個問題明顯是提示有內存泄露&#xff0c;今天就由這個問題開始分享一些關于內存泄漏的知識。 一、 Web 應用內存泄漏的危害與易忽略性 危害&…

在云服務器上搭建 MinIO 圖片存儲服務器及 Spring Boot 整合實現圖片上傳下載

一、MinIO 核心概念 MinIO 是一個高性能的分布式對象存儲服務器&#xff0c;兼容 Amazon S3 API&#xff0c;具有以下特點&#xff1a; 高性能&#xff1a;針對存儲和檢索優化 輕量級&#xff1a;單個二進制文件即可運行 云原生&#xff1a;支持 Kubernetes 部署 S3 兼容&a…

《深入解析:如何通過CSS集成WebGPU實現高級圖形效果》

當CSS的細膩筆觸遇上WebGPU的磅礴算力&#xff0c;兩者如同命運交織的織工&#xff0c;以代碼為絲線&#xff0c;在虛擬空間中編織出超越現實維度的靈境。這場融合不再局限于視覺呈現的革新&#xff0c;而是創造出一種能夠與用戶情感共鳴、突破物理法則束縛的沉浸式數字體驗&am…

R 語言科研繪圖 --- 環狀圖-匯總

在發表科研論文的過程中&#xff0c;科研繪圖是必不可少的&#xff0c;一張好看的圖形會是文章很大的加分項。 為了便于使用&#xff0c;本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中&#xff0c;獲取方式&#xff1a; R 語言科研繪圖模板 --- sciRplothttps://mp.…

突破限制:實現頁面內精準監聽 localStorage 變更

突破限制&#xff1a;實現頁面內精準監聽 localStorage 變更 一、簡介二、示例演示三、StorageEvent重構setItem四、CustomEvent自定義事件同一頁面不同模塊數據同步五、MessageChannel同一頁面不同模塊數據同步六、BroadcastChannel多窗口數據同步七、CustomEventBroadcastCha…

牛客AI面試破解電銷招聘效率與成本雙重難題

在電銷行業&#xff0c;高流動性與大規模招聘需求長期困擾企業人力資源管理。傳統招聘模式下&#xff0c;HR需應對海量簡歷篩選、多輪面試協調、主觀評估偏差等挑戰&#xff0c;導致招聘周期長、成本高、人才匹配度低。如何通過技術手段實現精準篩選與效率提升&#xff1f;牛客…

智慧生產管控數字化平臺(源碼+文檔+講解+演示)

引言 在全球化和信息化的浪潮中&#xff0c;制造業正面臨著前所未有的挑戰和機遇。智慧生產管控數字化平臺應運而生&#xff0c;旨在通過數字化手段優化生產管控的全流程。本文將詳細介紹智慧生產管控數字化平臺的核心功能、技術架構以及如何通過開源代碼實現二次開發&#xf…