如何使用 pydantic 链接验证
How to chain validations with pydantic
假设我有 webhook,我可以从中获取 json 数据。这个json是pydantic递归转换的
@app.route("/", methods=['POST'])
async def telegram_webhook(request):
update = Update.parse_obj(request.json)
/* do something with update */
我检查这个 json 是 minimal 具有 Update 模型的有效对象(其内部包含 Message 型号):
class Update(BaseModel):
update_id: int
message: Message
...
class Message(BaseModel):
message_id: int
text: Optional[str]
但稍后在代码中我想扩展验证,所以要检查message不仅是Message ,但是 TextMessage:
// text field now is required
class TextMessage(Message):
text: str
@validator('text')
def check_text_length(cls, value):
length = len(value)
if length > 4096:
raise ValueError(f'text length {length} is too large')
return value
所以我将消息传递给验证函数
def process_text_message(message):
text_message = TextMessage.parse_obj(message)
但我收到错误提示 pydantic 不需要 Message 类型,而是 dict。
我该怎么做?
我怎样才能对已经验证的(基本上)数据应用额外的验证?
简短的回答是:使用 message.dict()
:
def process_text_message(message):
text_message = TextMessage.parse_obj(message.dict())
较长的答案是 parse_obj
应该被修复以应对 "dict-like" 事情而不仅仅是命令,我将在 the issues you created.
上解释
假设我有 webhook,我可以从中获取 json 数据。这个json是pydantic递归转换的
@app.route("/", methods=['POST'])
async def telegram_webhook(request):
update = Update.parse_obj(request.json)
/* do something with update */
我检查这个 json 是 minimal 具有 Update 模型的有效对象(其内部包含 Message 型号):
class Update(BaseModel):
update_id: int
message: Message
...
class Message(BaseModel):
message_id: int
text: Optional[str]
但稍后在代码中我想扩展验证,所以要检查message不仅是Message ,但是 TextMessage:
// text field now is required
class TextMessage(Message):
text: str
@validator('text')
def check_text_length(cls, value):
length = len(value)
if length > 4096:
raise ValueError(f'text length {length} is too large')
return value
所以我将消息传递给验证函数
def process_text_message(message):
text_message = TextMessage.parse_obj(message)
但我收到错误提示 pydantic 不需要 Message 类型,而是 dict。
我该怎么做? 我怎样才能对已经验证的(基本上)数据应用额外的验证?
简短的回答是:使用 message.dict()
:
def process_text_message(message):
text_message = TextMessage.parse_obj(message.dict())
较长的答案是 parse_obj
应该被修复以应对 "dict-like" 事情而不仅仅是命令,我将在 the issues you created.