При описании моделей Pydantic часто пишется какой то базовый класс моделей от которого дальше наследуются остальные модели. Приведу пример из своего проекта:
class AppointmentBase(BaseModel): number:str = Field(None, title="Номер документа") patient_id:UUID4 = Field(None, title="ID Пациента") doctor_id:UUID4 = Field(None, title="ID доктора") clinic_id:UUID4 = Field(None, title="ID клиники") start:datetime = Field(None, title="Время начала приема") end:datetime = Field(None, title="Время окончания приема") status: StatusEnum = Field(None, title="Статус приема") diagnosis:str = Field(None, title="Диагноз") history:str = Field(None, title="Диагноз") complaint:str = Field(None, title="Жалобы") objectively:str = Field(None, title="Объективно") treatment:str = Field(None, title="Лечение") epicrisis:str = Field(None, title="Эпикриз") recomendations:str = Field(None, title="Рекомендации") class Config: use_enum_values=True
Допустим нам нужно определить еще один класс который будет наследоваться от класса выше, но при этом мы хотим скрыть какие то определенные поля.
Конечно всегда можно создать новый класс и описать все нужные поля еще раз, но проще и гибче будет наследоваться от родительского класса и скрыть определенные поля. Итак идем в документацию и видим там, что нам нужно сделать переопределение в подклассе Config нашей Pydantic — модели. Ниже я приведу свой код, у вас разумеется он будет немного другим.
В примере ниже я исключаю из вывода поля patient_id, clinic_id и doctor_id
class Doctor(BaseModel): id: UUID4 name: str class Config: orm_mode = True class AppointmentsEvents(AppointmentBase): id: UUID4 doctor: Doctor class Config: orm_mode = True fields = { 'doctor_id': { 'exclude': True, }, 'patient_id': { 'exclude': True, }, 'clinic_id': { 'exclude': True. } }
Замечания
Стоит отметить, что при скрытии полей методом выше, поля хоть и исключаются из вывода но, в документации OpenApi которую генерит FastApi они будут присутстовать.
Ну и чтоб убрать из описания полей то нужно у декоратора роутера указать response_model_exclude=[‘скрываемые поля’]