要在Pydantic模型中限制phone
字段只接受数字,可以通过自定义验证器来实现。User
类包含一个自定义验证器函数,该函数会检查phone
字段是否全为数字:
python
from pydantic import BaseModel, EmailStr, Field, validator
class User(BaseModel):
name: str = Field(..., min_length=1, max_length=10)
age: int = Field(..., ge=0, le=200)
email: EmailStr
phone: str = Field(default="13800138000", min_length=11, max_length=11)
@validator('phone')
def phone_must_be_digits(cls, value):
# 检查phone字段是否全部由数字组成
if not value.isdigit():
raise ValueError("Phone number must contain only digits.")
return value
# 测试用例
try:
user = User(name="Tom", age=22, email="alice@example.com", phone='1380013800e')
data = user.model_dump()
print("data:",data)
except ValueError as e:
print("error:",e) # 这里会打印出错误信息,因为phone字段包含了非数字字符
# 正确用例
try:
valid_user = User(name="Tom", age=22, email="alice@example.com", phone='13800138000')
valid_data = valid_user.model_dump()
print("valid_data:",valid_data)
except ValueError as e:
print("e:",e)
添加了一个名为phone_must_be_digits
的验证器装饰器到phone
字段。这个验证器会检查字段值是否全为数字,如果不是,则抛出一个ValueError
异常。这样,在尝试创建一个User
实例时,如果phone
字段包含了非数字字符,就会立即得到反馈。
运行结果如下:
python
@validator('phone')
error: 1 validation error for User
phone
Value error, Phone number must contain only digits. [type=value_error, input_value='1380013800e', input_type=str]
For further information visit https://errors.pydantic.dev/2.5/v/value_error
valid_data: {'name': 'Tom', 'age': 22, 'email': 'alice@example.com', 'phone': '13800138000'}