如何使用 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.

上解释