Удалить поле из всех вложенных моделей PydanticPython

Программы на Python
Ответить
Anonymous
 Удалить поле из всех вложенных моделей Pydantic

Сообщение Anonymous »

Я хотел бы иметь возможность определять поле в модели, которое можно было бы удалить во всех вложенных экземплярах, вызвав model_dump любым способом. Пример попытки см. ниже:
# Trying nested properties
from typing import Optional

from pydantic import BaseModel, Field, field_validator

class BaseModel2(BaseModel):
class_name: Optional[str] = Field(None, validate_default=True)

@field_validator("class_name")
@classmethod
def set_class_name(cls, v):
if v is None:
return cls.__name__
else:
raise ValueError("class_name must not be set")

class Level3(BaseModel2):
whatever: int = 10

class Level2(BaseModel2):
whatever: int
level3: Level3

class Level1(BaseModel2):
whenever: Optional[float] = 1.1
level2: Level2

m = Level1(whenever=3.14, level2=Level2(whatever=123, level3=Level3(whatever=20)))
print(m.model_dump(exclude={"class_name": True, "__all__": {"class_name"}}))
>>> {'whenever': 3.14, 'level2': {'whatever': 123, 'level3': {'class_name': 'Level3', 'whatever': 20}}}

Я ожидал, что исключение позволит мне исключить все имя_класса, но пока мне это не удалось.< /p>
Конечная цель
Если вышеперечисленное невозможно, то возможно что-то еще. Моя конечная цель - разрешить дамп модели, специфичный для контекста.
Но, что особенно важно, я не хочу менять сериализацию одного поля, я хочу добавить некоторую информацию (имя класса модели cls.__name__) для сериализации модели. Все последующие модели будут наследоваться от него и также смогут сбрасывать эту информацию. Посмотрите это обсуждение, как я мог добиться этого в V1, поскольку dict на самом деле рекурсивный! : https://github.com/pydantic/pydantic/discussions/11078
Изменить
Например, я мог бы представить себе работу с пользовательским сериализатором , но тогда я столкнулся бы с проблемами рекурсии ИЛИ (закомментировано) с перезаписью функциональности model_dump:
class BaseModel2(BaseModel):
# def model_dump(self, **kwargs):
# _dict = super().model_dump(serialize_as_any=True, **kwargs)
# # _dict["__vizro_model__"] = self.__class__.__name__
# return _dict

@model_serializer
def ser_model(self, info: SerializationInfo) -> Dict[str, Any]:
print("CONTEXT", info)
_dict = {} # self.model_dump()
_dict["__vizro_model__"] = self.__class__.__name__
return _dict


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

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

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

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

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

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