Динамическое значение по умолчанию из другой модели Pydantic

#python #pydantic

#python #pydantic

Вопрос:

Пример кода:

 class MyModel(BaseModel):
    name: str = "examplename"

class MySecondModel(BaseModel):
    derivedname: Optional[str]
    @validator('derivedname')
    def default_name(cls, v, *, values, **kwargs):
        return v or values[MyModel.name]  # psuedocode, doesn't work
 

Я знаю, что это работает, когда поле находится в том же классе, и у меня нет проблем с этим. Однако я хотел бы указать значение по умолчанию на основе поля в экземпляре другой модели pydantic.

Конечно, я мог бы просто взять модель в своем коде и сделать это программно, но я бы хотел избежать этого по вполне очевидным причинам.

Возможно ли это или я зря трачу свое время?

Ответ №1:

Это необычно, но вы можете сохранить связанный объект модели как переменную частного класса и использовать его в валидаторе.

 class MyModel(BaseModel):
    name: str = "examplename"

class MySecondModel(BaseModel):
    derivedname: Optional[str]
    _my_model: ClassVar[MyModel] = MyModel()

    @validator('derivedname')
    def default_name(cls, v, *, values, **kwargs):
        return v or cls._my_model.name
 

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

1. Будет ли это работать, если модель не использует значение по умолчанию для «name»?

2. Конечно, вы можете сохранить _my_model произвольный предварительно созданный экземпляр модели, а также переписать его позже