PydanticUUID验证支持版本吗

wen python案例 1

本文目录导读:

PydanticUUID验证支持版本吗

  1. 使用 UUID 类型(验证任意版本)
  2. 使用 constr 格式验证(正则表达式)
  3. 使用自定义验证器
  4. 使用 Pydantic v2 的 AfterValidator(更简洁)
  5. UUID 版本说明

是的,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 版本。

抱歉,评论功能暂时关闭!