Допустим, у меня есть веб-хук, откуда я получаю данные json. Этот 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]
Но позже в коде я хочу проверить продлевать, чтобы проверить, что сообщение — это не только Сообщение, но и Текстовое сообщение:
// 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)
Но получаю ошибку, что для пидантичный требуется тип не Сообщение, а диктовать.
Как бы я это сделал? Как я могу применить дополнительную проверку к уже проверенным (в основном) данным?






Короткий ответ: используйте message.dict():
def process_text_message(message):
text_message = TextMessage.parse_obj(message.dict())
Более длинный ответ заключается в том, что parse_obj должен быть исправлен, чтобы справляться с «подобными диктовке» вещами, а не только с диктовками, я объясню это в проблемы, которые вы создали.