本文目录导读:

是的,Pydantic 的 UUID 验证支持指定版本。
Pydantic 提供了 UUID 类型(对应 Python 的 uuid.UUID),并且可以通过以下几种方式验证 UUID 的版本:
使用 UUID 类型(验证任意版本)
from pydantic import BaseModel
from uuid import UUID
class Model(BaseModel):
id: UUID
# 所有版本都接受
m = Model(id="550e8400-e29b-41d4-a716-446655440000") # UUID v1
m = Model(id="6ba7b810-9dad-11d1-80b4-00c04fd430c8") # UUID v1
m = Model(id="f47ac10b-58cc-4372-a567-0e02b2c3d479") # UUID v4
使用 constr 格式验证(正则表达式)
from pydantic import BaseModel, constr
import re
# 只接受 UUID v4
UUID_V4_PATTERN = r'^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$'
class Model(BaseModel):
id: constr(pattern=UUID_V4_PATTERN)
m = Model(id="f47ac10b-58cc-4372-a567-0e02b2c3d479") # UUID v4 ✓
# m = Model(id="550e8400-e29b-41d4-a716-446655440000") # UUID v1 ✗ (会报错)
使用自定义验证器
from pydantic import BaseModel, field_validator
from uuid import UUID
class Model(BaseModel):
id: UUID
@field_validator('id')
@classmethod
def check_uuid_version(cls, v: UUID) -> UUID:
# v.version 返回 UUID 的版本号 (1-5)
if v.version != 4: # 只接受 UUID v4
raise ValueError(f'Only UUID v4 is allowed, got v{v.version}')
return v
# 测试
try:
m = Model(id="550e8400-e29b-41d4-a716-446655440000") # UUID v1 - 会报错
except ValueError as e:
print(f"Error: {e}")
m = Model(id="f47ac10b-58cc-4372-a567-0e02b2c3d479") # UUID v4 - 成功
使用 Pydantic v2 的 AfterValidator(更简洁)
from pydantic import BaseModel, AfterValidator
from typing import Annotated
from uuid import UUID
def uuid_v4_only(v: UUID) -> UUID:
if v.version != 4:
raise ValueError(f'Only UUID v4 is allowed, got v{v.version}')
return v
UUIDv4 = Annotated[UUID, AfterValidator(uuid_v4_only)]
class Model(BaseModel):
id: UUIDv4
m = Model(id="f47ac10b-58cc-4372-a567-0e02b2c3d479") # ✓
UUID 版本说明
- v1: 基于时间戳和 MAC 地址
- v2: DCE 安全版本
- v3: 基于命名空间和名称的 MD5 哈希
- v4: 随机生成(最常用)
- v5: 基于命名空间和名称的 SHA-1 哈希
Pydantic 的 UUID 类型本身不限制版本,但你可以通过正则表达式、自定义验证器或 AfterValidator 来强制验证特定的 UUID 版本。