1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
The [BaseModel](https://docs.pydantic.dev/latest/usage/models/) in [Pydantic](https://github.com/pydantic/pydantic)
supports some custom configurations([Model Config](https://docs.pydantic.dev/latest/usage/model_config/)),
so we can use the `openapi_extra` to extend OpenAPI Specification.
## openapi_extra
The `openapi_extra` will be merged with the automatically generated OpenAPI schema.
### form
```python
class UploadFilesForm(BaseModel):
file: FileStorage
str_list: List[str]
model_config = dict(
openapi_extra={
# "example": {"a": 123},
"examples": {
"Example 01": {
"summary": "An example",
"value": {
"file": "Example-01.jpg",
"str_list": ["a", "b", "c"]
}
},
"Example 02": {
"summary": "Another example",
"value": {
"str_list": ["1", "2", "3"]
}
}
}
}
)
```
Effect in Redoc:

### body
```python
class BookBody(BaseModel):
age: int
author: str
model_config = dict(
openapi_extra={
"description": "This is post RequestBody",
"example": {"age": 12, "author": "author1"},
"examples": {
"example1": {
"summary": "example summary1",
"description": "example description1",
"value": {
"age": 24,
"author": "author2"
}
},
"example2": {
"summary": "example summary2",
"description": "example description2",
"value": {
"age": 48,
"author": "author3"
}
}
}}
)
```
Effect in swagger:

You can use `reqiured` in `openapi_extra` to mark the RequestBody as Optional.
```python
class PingBody(BaseModel):
ping: Optional[str] = Field("ok", description="String to return, 'ok' when null.")
model_config = dict(
openapi_extra = {
"required": False
}
)
```
### responses
```python
class MessageResponse(BaseModel):
message: str = Field(..., description="The message")
model_config = dict(
openapi_extra={
# "example": {"message": "aaa"},
"examples": {
"example1": {
"summary": "example1 summary",
"value": {
"message": "bbb"
}
},
"example2": {
"summary": "example2 summary",
"value": {
"message": "ccc"
}
}
}
}
)
```
Effect in swagger:

## by_alias
Sometimes you may not want to use aliases (such as in the responses model). In that case, `by_alias` will be convenient:
```python
class MessageResponse(BaseModel):
message: str = Field(..., description="The message")
metadata: dict[str, str] = Field(alias="metadata_")
model_config = dict(
by_alias=False
)
```
|