При описании моделей 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 не будет опубликован. Обязательные поля помечены *

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