考慮以下說明使用pydantic BaseModelwith 驗證的代碼:
from pydantic import BaseModel, validator
class User(BaseModel, frozen=True):
id_key: int
user_id: int
@validator('user_id')
def id_check(cls, v, values):
if v > 2 * values['id_key'] 1:
raise ValueError('id check failed.')
return v
user_dict = {'user_id': 10, 'id_key': 60}
u = User(**user_dict)
現在,在我的應用程式中,我真的不想id_key成為模型實體中的常規、可訪問欄位,例如u——它的唯一目的是驗證user_id. 對于我的示例,有沒有一種方法可以訪問以id_key進行驗證但不是標準欄位?
uj5u.com熱心網友回復:
values您在函式中的引數是已經為您的實體驗證id_check過的屬性的內部字典,如果您只需要在實體化時進行檢查而不是在那之后,您可以簡單地將其從.id_keyvalues
from pydantic import BaseModel, validator
class User(BaseModel, frozen=True):
id_key: int
user_id: int
@validator('user_id')
def id_check(cls, v, values):
if v > 2 * values['id_key'] 1:
raise ValueError('id check failed.')
values.pop('id_key')
return v
user_dict = {'user_id': 10, 'id_key': 60}
u = User(**user_dict)
print(u)
# output:
# user_id=10
我想對您的代碼提出另一項改進建議:在當前狀態下,pydantic 在回傳驗證錯誤之前運行所有欄位的驗證,如果您傳遞了完全無效的內容,id_key例如“abc”,或者省略它,它不會被添加到 中values,并且 的驗證user_id將與 崩潰KeyError: 'id_key',吞噬所有其余的驗證程序并且不回傳任何有意義的訊息。
user_dict = {'user_id': 10, 'id_key': 'abc'}
u = User(**user_dict)
# output:
# KeyError: 'id_key'
這不是很明確,如果您期望 pydantic ,可能會導致您的應用程式出現問題ValidationError。您可能想要檢查它id_key是否確實存在,values如果不存在則干凈地提出錯誤。
from pydantic import BaseModel, validator
class User(BaseModel, frozen=True):
id_key: int
user_id: int
@validator('user_id')
def id_check(cls, v, values):
if 'id_key' not in values or v > 2 * values['id_key'] 1:
raise ValueError('id check failed.')
values.pop('id_key')
return v
user_dict = {'user_id': 10, 'id_key': 'abc'}
u = User(**user_dict)
# output:
# pydantic.error_wrappers.ValidationError: 2 validation errors for User
# id_key
# value is not a valid integer (type=type_error.integer)
# user_id
# id check failed.(type=value_error)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487052.html
