Как связать валидации с pydantic - PullRequest
0 голосов
/ 13 апреля 2019

Допустим, у меня есть webhook, где я получаю данные 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]

Но позже в коде я хочу продлить проверку, чтобы проверить, что сообщение не только Сообщение , но 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 Ответ

1 голос
/ 15 апреля 2019

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

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

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

...