为了扩展 的答案Rahul R
,这个例子更详细地展示了如何使用pydantic
验证器。
此示例包含回答您的问题所需的所有信息。
import pydantic
class Parent(pydantic.BaseModel):
name: str
comments: str
class Customer(Parent):
address: str
phone: str
# If you want to apply the Validator to the fields "name", "comments", "address", "phone"
@pydantic.validator("name", "comments", "address", "phone")
@classmethod
def validate_all_fields_one_by_one(cls, field_value):
# Do the validation instead of printing
print(f"{cls}: Field value {field_value}")
return field_value # this is the value written to the class field
# if you want to validate to content of "phone" using the other fields of the Parent and Child class
@pydantic.validator("phone")
@classmethod
def validate_one_field_using_the_others(cls, field_value, values, field, config):
parent_class_name = values["name"]
parent_class_address = values["address"] # works because "address" is already validated once we validate "phone"
# Do the validation instead of printing
print(f"{field_value} is the {field.name} of {parent_class_name}")
return field_value
Customer(name="Peter", comments="Pydantic User", address="Home", phone="117")
输出
<class '__main__.Customer'>: Field value Peter
<class '__main__.Customer'>: Field value Pydantic User
<class '__main__.Customer'>: Field value Home
<class '__main__.Customer'>: Field value 117
117 is the phone number of Peter
Customer(name='Peter', comments='Pydantic User', address='Home', phone='117')
要更详细地回答您的问题:
将要验证的字段添加到@validator
验证函数正上方的装饰器中。
@validator("name")
使用"name"
(eg "Peter"
) 的字段值作为验证函数的输入。类及其父类的所有字段都可以添加到@validator
装饰器中。
- 验证函数 (
validate_all_fields_one_by_one
) 然后使用字段值作为第二个参数 ( field_value
) 来验证输入。验证函数的返回值写入类字段。验证函数的签名是def validate_something(cls, field_value)
可以任意选择函数和变量名称的地方(但第一个参数应该是cls
)。根据 Arjan ( https://youtu.be/Vj-iU-8_xLs?t=329 ),还@classmethod
应该添加装饰器。
如果目标是通过使用父类和子类的其他(已经验证的)字段来验证一个字段,则验证函数的完整签名是def validate_something(cls, field_value, values, field, config)
(参数名称values
,field
并且config
必须匹配)可以通过以下方式访问字段的值字段名称作为键(例如values["comments"]
)。
编辑:如果您只想检查某种类型的输入值,您可以使用以下结构:
@validator("*") # validates all fields
def validate_if_float(cls, value):
if isinstance(value, float):
# do validation here
return value