Могу ли я вернуть разные схемы из Pydantic model_validator?Python

Программы на Python
Ответить
Anonymous
 Могу ли я вернуть разные схемы из Pydantic model_validator?

Сообщение Anonymous »

Краткое описание проблемы: хорошо зарекомендовавшая себя таблица БД предполагает диапазон просмотров страниц. Однако при разработке API я обнаружил, что это ужасный пользовательский опыт. Я планирую создать поле мин/макс, чтобы пользователь мог вводить данные, а затем изменить его так, чтобы оно соответствовало формату, ожидаемому БД.
Я не могу ничего изменить в структуре таблицы БД. .
Мой текущий код:

Код: Выделить всё

class PageViewsRangeSchema(BaseWrite):
"""BaseWrite just provides config to exclude extra fields
"""
# These constraints are not needed since this is an internal Schema, but it is good practice to have them
pages_viewed_range: Annotated[str,
StringConstraints(strip_whitespace=True, min_length=3, max_length=64)
] = Field()

class PageViewsSchemaWrite(BaseWrite):
# PageViews is an enum that is discriminated against
in_type: Literal[PageViews] = Field(exclude=True)
minimum_views: NonNegativeInt = Field()
maximum_views: NonNegativeInt = Field()

@model_validator(mode="after")
def validate_page_viewed_range(self) -> PageViewsRangeSchema:
if self.minimum_views > self.maximum_views:
raise ValueError("Error here.")
# Cannot use a model_serializer here because it is applied and shared
# amongst all Schemas. The DB expects a range of min-max, but that is a bad user experience.
return PageViewsRangeSchema(pages_viewed_range=f"{self.minimum_views}-{self.maximum_views}")
На практике это просто работает. Документы выглядят нормально, я могу отправить минимальное/максимальное значение через запрос API, и оно преобразуется в диапазон для БД. Я знаю, что model_validator должен возвращать Self, но я не могу заставить это соответствовать моему варианту использования. Если у меня есть дополнительное свойство вычисляемого поля, оно не вызывается для вставки в БД, а также жалуется, что есть дополнительные поля. На данный момент я не могу изменить существующее поведение при записи этих моделей в БД.
Однако, когда я пишу модульные тесты, я обнаружил, что это «не просто работает». ." Что бы я ни делал, я не могу заставить модульный тест возвращать экземпляр PageViewsRangeSchema, как это происходит при фактическом запуске кода.
Пример моих тестов выглядит следующим образом. :

Код: Выделить всё

schema = make_target_schema(
schema=PageViewsSchemaWrite,
in_type=PageViews,
minimum_views=1,
maximum_views=5)
# me trying to see if it works by dumping... It doesn't
dumped_schema = schema.model_dump(by_alias=True)
assert schema.pages_viewed_range == "1-5"
Я пытаюсь выяснить, является ли это приемлемым рабочим процессом или поведение «не определено», что приводит к разнице между запуском его в реальном времени и модульными тестами. Или, если я что-то упустил из виду и нужно сделать совершенно по-другому.
Я попробовал использовать model_serializer для этого случая. Однако model_serializer используется всеми схемами, что приводит к сбоям в процессе.
Я ожидал, что сериализатор не будет использоваться совместно.
Пример текущей реализации приведен выше. Для этого я ожидаю, что после проверки модели будет возвращена другая схема. Это верно на практике, но не во время модульного тестирования.


Подробнее здесь: https://stackoverflow.com/questions/793 ... -validator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»