Как связать валидации с 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
должно быть исправлено, чтобы справляться с "подобными диктату" вещами, а не просто диктантами, я объясню это на проблемах, которые вы создали.