如何使用pydantic链接验证

时间:2019-04-13 14:53:18

标签: python json validation pydantic

假设我在获取json数据的地方有webhook。此json由pydantic递归转换。

@app.route("/", methods=['POST'])
async def telegram_webhook(request):
    update = Update.parse_obj(request.json)
    /* do something with update */

我用 Update 模型(内部包含 Message 模型)检查此json是 minimum 个有效对象:

class Update(BaseModel):
    update_id: int
    message: Message
    ...

class Message(BaseModel):
    message_id: int
    text: Optional[str]

但是稍后在代码中我想扩展验证,因此要检查消息不仅是消息,而且是 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

我该怎么做? 我如何才能对已验证(基本)的数据进行附加验证?

1 个答案:

答案 0 :(得分:1)

简短的答案是:使用message.dict()

def process_text_message(message):
    text_message = TextMessage.parse_obj(message.dict())

更长的答案是应该固定parse_obj以应对“ dict-like”之类的问题,而不仅仅是字典,我将在the issues you created上进行解释。