При описании моделей 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=[‘скрываемые поля’]
