Анализ различных форматов времени с помощью pydantic json_decoders работает не так, как ожидалось

#python #datetime #format #iso #pydantic

#python #дата и время #формат #iso #pydantic

Вопрос:

Может кто-нибудь, пожалуйста, объяснить мне поведение следующей pydantic модели.

 from datetime import datetime
from pydantic import BaseModel

first_format = {'time': '2018-01-05T16:59:33 00:00',}
second_format = {'time': '2021-03-05T08:21:00.000Z',}

class TimeModel(BaseModel):
    time: datetime

    class Config:
        json_encoders = {
            datetime: lambda v: v.isoformat(),
        }
        json_decoders = {
            datetime: lambda v: datetime.fromisoformat(v),
        }

print(TimeModel.parse_obj(first_format))
print("first_format successfull")
print(TimeModel.parse_obj(second_format))
print("second_format successfull")
 

Вывод:

 time=datetime.datetime(2018, 1, 5, 16, 59, 33, tzinfo=datetime.timezone.utc)
first_format successfull
time=datetime.datetime(2021, 3, 5, 8, 21, tzinfo=datetime.timezone.utc)
second_format successfull
 

Ожидаемое поведение:

Работает first_format так же, как и сейчас, но терпит неудачу, second_format поскольку datetime.fromisoformat(second_format) выдает ошибку из-за неправильного формата

Что я хочу сделать:

Анализируйте время, только если оно имеет формат first_format , иначе возникает исключение.

Спасибо за вашу помощь

Редактировать: позже я понял, что не существует такой вещи, как json_decoders , поэтому, пожалуйста, не смущайтесь этим

Проблема решена

Ответ №1:

Вам нужно использовать pre validator здесь, чтобы проанализировать и проверить входящую строку даты и времени:

 from datetime import datetime
from pydantic import BaseModel, validator

first_format = {'time': '2018-01-05T16:59:33 00:00',}
second_format = {'time': '2021-03-05T08:21:00.000Z',}


class TimeModel(BaseModel):
    time: datetime

    class Config:
        json_encoders = {
            datetime: lambda v: v.isoformat(),
        }

    @validator('time', pre=True)
    def time_validate(cls, v):
        return datetime.fromisoformat(v)


print(TimeModel.parse_obj(first_format).json())
print("first_format successfull")
print(TimeModel.parse_obj(second_format))
print("second_format successfull")
 

Комментарии:

1. Позже я понял , что не существует такого понятия , как json_decoders » извините за то , что , возможно , сбил кого — то с толку этим