我正在嘗試在遞回的 pydantic 資料模型中添加驗證。但是,即使檢查失敗,驗證器也不會引發錯誤。
from __future__ import annotations
from typing import Optional, Union, List
import orjson
from pydantic import BaseModel, validator
def orjson_dumps(v, *, default):
return orjson.dumps(v, default=default).decode()
class Condition(BaseModel):
operation: str
value: Union[List[Condition], Condition, float, int, list, str]
attribute_name: Optional[str]
@validator("operation", pre=True, always=True)
@classmethod
def validate_operations(cls, field_value):
if field_value not in ["and", "or", "equal"]:
msg = f"Supported operations: [and, or, equal]. Passed operation: {field_value}"
raise ValueError(msg)
return field_value
if __name__ == '__main__':
condition4 = {'operation': 'or', 'value': [
{'operation': 'equal', 'attribute_name': 'num_pay_txns_month', 'value': 6},
{'operation': 'incorrect_operation', 'attribute_name': 'num_pay_txns_week', 'value': 3}]}
print(Condition(**condition4))
實際輸出:
operation='or' value=[{'operation': 'equal', 'attribute_name': 'num_pay_txns_month', 'value': 6}, {'operation': 'incorrect_operation', 'attribute_name': 'num_pay_txns_week', 'value': 3}] attribute_name=None
預期輸出:
ValueError
uj5u.com熱心網友回復:
啊,這花了我一段時間才弄清楚。問題出在value注釋中。這是因為您list在該型別聯合中有一個未指定的。洗掉它并按預期引發驗證錯誤:
class Condition(BaseModel):
operation: str
value: Union[List[Condition], Condition, float, int, str]
...
原因是,通過添加未指定的list內容,您基本上是在說 that valueis allowed to be list[Any]。因此,當驗證包含錯誤值的字典的所有其他嘗試都失敗時,它只是“按原樣”,即某個字典。這就是為什么value在頂級物件上只是一個字典串列,而不是Condition實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513403.html
上一篇:如何正確控制資料輸入?
