Как в pydantic схеме в fastapi установить значение по умолчанию None для словаря (JSON)?

Как можно организовать схемы для валидации данных так, чтобы поле "coord" по умолчанию принимало значение None, если оно не было передано в запросе?
  • 9 января 2024 г. 15:47
Ответы на вопрос 2
Ваша модель Pydantic (которая используется в FastAPI) может как определить значение по умолчанию для поля словаря (JSON), так и установить его как `None`, если вы хотите разрешить его опускание. Вам нужно будет импортировать `BaseModel` из `pydantic`, и затем создать модель, содержащую ваше поле `coord`. Пример модели, включая поле `coord` со значением по умолчанию `None`:

```python
from typing import Optional, Dict
from pydantic import BaseModel

class MyModel(BaseModel):
    coord: Optional[Dict] = None
```

Здесь тип поля `coord` указан как `Optional[Dict]`, это означает, что `coord` может быть либо `None`, либо словарем (`Dict`). Вы также указали значение по умолчанию `= None`, что будет присваиваться, если поле `coord` не будет передано при создании объекта `MyModel`.

Теперь вы можете использовать эту модель в FastAPI для валидации входящего JSON запроса:

```python
from fastapi import FastAPI, Body
from pydantic import BaseModel
from typing import Optional, Dict

app = FastAPI()

class MyModel(BaseModel):
    coord: Optional[Dict] = None

@app.post("/items/")
async def create_item(item: MyModel):
    # Если 'coord' не был предоставлен, он будет None
    return {"coord": item.coord}
```

В этом примере FastAPI API запрос на `POST /items/` будет принимать JSON данные, которые валидируются с помощью `MyModel`. Если ключ `coord` в JSON отсутствует, FastAPI автоматически установит значение поля `coord` как `None` в вашем экземпляре `MyModel`. Если ключ `coord` присутствует, он должен соответствовать структуре словаря, иначе будет возвращена ошибка валидации.

Обратите внимание, что FastAPI автоматически документирует ваше API и информирует пользователей о том, что поле `coord` необязательно и может принимать значение `null`.

UP: а слона я и не заметил, dict это ключ-значение, поэтому dict[Coord] некорректное определение
Похожие вопросы