Я хотел бы иметь возможность определять поле в модели, которое можно было бы удалить во всех вложенных экземплярах, вызвав 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
Удалить поле из всех вложенных моделей Pydantic ⇐ Python
Программы на Python
-
Anonymous
1734002261
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}}}
Я ожидал, что исключение позволит мне исключить [b]все[/b] имя_класса, но пока мне это не удалось.< /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
Подробнее здесь: [url]https://stackoverflow.com/questions/79272335/remove-field-from-all-nested-pydantic-models[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия