API REST в Python с FastAPI и pydanti c: свойство только для чтения в модели - PullRequest
1 голос
/ 26 января 2020

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

Вход JSON должен выглядеть следующим образом:

{
    "name": "bar"
}

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

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

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

class FooIn(BaseModel):
    name: str

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

Я не могу найти упоминаний "только для чтения", "только для чтения" или "только для чтения" в документации по pydanti c или в Код класса поля.

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

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

Но, похоже, это не имеет никакого эффекта в моем случае использования.

1 Ответ

2 голосов
/ 27 января 2020

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

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

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

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

...