REST API в Python с FastAPI и pydantic: свойство только для чтения в модели

Предположим, что REST API определяет метод POST для ресурса / foos для создания нового Foo. При создании Foo имя Foo является входным параметром (присутствует в теле запроса). Когда сервер создает Foo, он присваивает ему идентификатор. Этот идентификатор возвращается вместе с именем в ответе REST. Ищу что-то похожее на readOnly в OpenAPI.

Входной JSON должен выглядеть так:

{
    "name": "bar"
}

Выходной JSON должен выглядеть так:

{
    "id": 123,
    "name": "bar"
}

Есть ли способ повторно использовать ту же пидантическую модель? Или нужно использовать две разные модели?

class FooIn(BaseModel):
    name: str

class Foo(BaseModel):
    id: int
    name: str

Я не могу найти упоминания «только для чтения», «только для чтения» или «только для чтения» в документации pydantic или в коде класса Field.

Погуглив, я нашел сообщение, в котором упоминается

id: int = Schema(..., readonly=True)

Но, похоже, это не повлияло на мой вариант использования.


person DrP3pp3r    schedule 26.01.2020    source источник


Ответы (1)


Иметь несколько моделей - это нормально. Вы можете использовать наследование, чтобы уменьшить повторение кода:

from pydantic import BaseModel


# Properties to receive via API create/update
class Foo(BaseModel):
    name: str


# Properties to return via API
class FooDB(Foo):
    id: int

документация , которая, кстати, отличная!, входит в это более подробно.

Вот пример реальной пользовательской модели, взятой из официального генератора полного стека проекта. Вы можете увидеть, как существует несколько моделей для определения пользовательской схемы в зависимости от контекста.

person michaeloliver    schedule 27.01.2020