Используя FastAPI и Pydantic, как определить необязательное поле с описанием

Для класса FastAPI Pydanctic у меня есть эти значения

class ErrorReportRequest(BaseModel):
    sender: Optional[str] = Field(..., description="Who sends the error message.")
    error_message_displayed_to_client: str = Field(..., description="The error message displayed to the client.")

Я использую класс как входную модель

router = APIRouter()

@router.post(
    "/error_report",
    response_model=None,
    include_in_schema=True,

)
def error_report(err: ErrorReportRequest):
    pass

Когда я запускаю это, sender является обязательным полем. Если он не включен во входящий JSON, я получаю сообщение об ошибке проверки.

Вход:

{
  "error_message_displayed_to_client": "string"
}

Результаты в:

{
  "detail": [
    {
      "loc": [
        "body",
        "sender"
      ],
      "msg": "field required",
      "type": "value_error.missing"
    }
  ]
}

Если я удалю описание поля следующим образом:

    class ErrorReportRequest(BaseModel):
        sender: Optional[str]
        error_message_displayed_to_client: str = Field(..., description="The error message displayed to the client.")

запрос проходит.

Как я могу добавить описание поля к необязательному полю, чтобы по-прежнему можно было опускать имя поля?


person 576i    schedule 17.05.2021    source источник


Ответы (1)


Вам нужно будет указать явное значение по умолчанию для Field, например None вместо ...:

class ErrorReportRequest(BaseModel):
    sender: Optional[str] = Field(None, description="Who sends the error message.")
    error_message_displayed_to_client: str = Field(..., description="The error message displayed to the client.")

... указывает, что значение является обязательным. Это, конечно, противоречит Optional, но похоже, что pydantic отдает более высокий приоритет ....

Из документации Field:

default: (позиционный аргумент) значение поля по умолчанию. Поскольку Field заменяет значение поля по умолчанию, этот первый аргумент можно использовать для установки значения по умолчанию. Используйте многоточие (...), чтобы указать, что поле является обязательным.

person mihi    schedule 17.05.2021