0

假设我有获取 json 数据的 webhook。这个json是由pydantic递归转换的。

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

我用更新模型检查这个 json 是最小的有效对象(内部包含消息模型):

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

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

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

我该怎么做?我如何对已经验证的(基本上)数据应用额外的验证?

4

1 回答 1

1

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

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

更长的答案是parse_obj应该修复它以应对“类似字典”的东西而不仅仅是字典,我将在你创建的问题上解释这一点。

于 2019-04-15T10:08:41.937 回答