Как исключить поля из моделей Pydantic

Исключить поля из моделей Pydantic

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

Вам также может понравиться

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика