Валидаторы пользовательского типа Pydantic v2 с информациейPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Валидаторы пользовательского типа Pydantic v2 с информацией

Сообщение Anonymous »

Я пытаюсь обновить свой код до pydantic v2, но не могу найти хороший способ воспроизвести пользовательские типы, которые у меня были в версии 1. В качестве примера я буду использовать свой собственный тип даты. Исходная реализация и использование выглядели примерно так:

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

from datetime import date
from pydantic import BaseModel

class CustomDate(date):
# Override POTENTIAL_FORMATS and fill it with date format strings to match your data
POTENTIAL_FORMATS = []

@classmethod
def __get_validators__(cls):
yield cls.validate_date

@classmethod
def validate_date(cls, field_value, values, field, config) -> date:
if type(field_value) is date:
return field_value
return to_date(field.name, field_value, cls.POTENTIAL_FORMATS, return_str=False)

class ExampleModel(BaseModel):
class MyDate(CustomDate):
POTENTIAL_FORMATS = ['%Y-%m-%d', '%Y/%m/%d']
dt: MyDate
Я пытался следовать официальной документации и примерам, изложенным ниже, и в основном это сработало, но параметр info не имеет нужных мне полей ( и имя_поля). Попытка доступа к ним выдает ошибку AttributeError.

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

info.field_name
*** AttributeError: No attribute named 'field_name'
Эта проблема возникает как в подходе с аннотациями, так и в подходе __get_pydantic_core_schema__

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

from datetime import date
from typing import Annotated

from pydantic import BaseModel, BeforeValidator
from pydantic_core import core_schema

class CustomDate:
POTENTIAL_FORMATS = []

@classmethod
def validate(cls, field_value, info):
if type(field_value) is date:
return field_value
return to_date(info.field_name, field_value, potential_formats, return_str=False)

@classmethod
def __get_pydantic_core_schema__(cls, source, handler) -> core_schema.CoreSchema:
return core_schema.general_plain_validator_function(cls.validate)

def custom_date(potential_formats):
"""
:param potential_formats: A list of datetime format strings
"""
def validate_date(field_value, info) -> date:
if type(field_value) is date:
return field_value
return to_date(info.field_name, field_value, potential_formats, return_str=False)
CustomDate = Annotated[date, BeforeValidator(validate_date)]
return CustomDate

class ExampleModel(BaseModel):
class MyDate(CustomDate):
POTENTIAL_FORMATS = ['%Y-%m-%d', '%Y/%m/%d']
dt: MyDate
dt2: custom_date(['%Y-%m-%d', '%Y/%m/%d'])
Если я просто включу функцию validate_date как обычный field_validator, я получу информацию со всеми нужными мне полями, только при ее использовании с пользовательские типы, с которыми я вижу эту проблему. Как мне написать собственный тип, который имеет доступ к ранее проверенным полям и имени проверяемого поля?

Подробнее здесь: https://stackoverflow.com/questions/771 ... -with-info
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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