Как связать валидации с pydantic

Допустим, у меня есть webhook, где я получаю данные JSON. Этот JSON рекурсивно конвертируется с помощью пидантики.

@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 требуется не тип сообщения, а dict.

Как бы я это сделал? Как я могу применить дополнительную проверку к уже проверенным (в основном) данным?

1 ответ

Решение

Краткий ответ: использовать message.dict():

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

Чем дольше ответ parse_obj должно быть исправлено, чтобы справляться с "подобными диктату" вещами, а не просто диктантами, я объясню это на проблемах, которые вы создали.

Другие вопросы по тегам