如何使用Pydantic验证列表中对象的ID唯一性?
使用Pydantic验证列表中用户ID不重复的方法
方案1:自定义字段验证器(兼容Pydantic v1/v2)
通过给包含用户列表的父模型添加自定义验证器,实现对所有用户ID的唯一性检查。
代码示例
from pydantic import BaseModel, ValidationError, validator from typing import List class UserModel(BaseModel): name: str id: int class UserListModel(BaseModel): users: List[UserModel] @validator('users') def check_unique_ids(cls, user_list): user_ids = [user.id for user in user_list] if len(user_ids) != len(set(user_ids)): raise ValueError('用户ID不能重复') return user_list # 测试重复ID场景 try: raw_data = {"users": [{"id":1,"name":"bob"},{"id":1,"name":"mary"}]} validated_data = UserListModel(**raw_data) except ValidationError as e: print(e)
方案2:Pydantic v2专属模型验证器(官方推荐)
如果使用Pydantic v2,更推荐使用model_validator实现模型级别的验证逻辑:
代码示例
from pydantic import BaseModel, ValidationError, model_validator from typing import List class UserModel(BaseModel): name: str id: int class UserListModel(BaseModel): users: List[UserModel] @model_validator(mode='after') def check_unique_ids(self): user_ids = [user.id for user in self.users] if len(user_ids) != len(set(user_ids)): raise ValueError('存在重复的用户ID') return self # 验证测试 try: raw_data = {"users": [{"id":1,"name":"bob"},{"id":1,"name":"mary"}]} validated_data = UserListModel(**raw_data) except ValidationError as e: print(e)
核心逻辑说明
- 两种方案的核心思路一致:提取列表内所有用户的ID,利用集合自动去重的特性,对比原列表长度与去重后的集合长度,判断是否存在重复ID。
- 必须将用户列表包装在父模型(如
UserListModel)中,才能为整个列表添加自定义验证规则,直接对List[UserModel]类型无法绑定验证逻辑。
内容的提问来源于stack exchange,提问作者Joseph Ng
相关产品推荐
相关产品推荐

