Skip to content

Body - Fields

Just like Path and Query, you can use Pydantic's Field in Body to declare validation rules within a model and provide additional metadata. This allows you to define validation for request bodies more clearly in your API.

import Field

First, you have to import it:

from typing import Annotated

from nexify import Body, Nexify
from pydantic import BaseModel, Field

app = Nexify()


class Item(BaseModel):
    name: str
    description: Annotated[
        str | None,
        Field(
            default=None,
            description="The description of the item",
            max_length=300,
        ),
    ]
    price: Annotated[
        float,
        Field(
            gt=0,
            description="The price must be greater than zero",
        ),
    ]
    tax: Annotated[
        float | None,
        Field(
            default=None,
            gt=0,
        ),
    ]


@app.post("/items")
def create_item(item: Annotated[Item, Body()]):
    return item.model_dump()

Declaring Model Attributes

You can then use Field with model attributes:

from typing import Annotated

from nexify import Body, Nexify
from pydantic import BaseModel, Field

app = Nexify()


class Item(BaseModel):
    name: str
    description: Annotated[
        str | None,
        Field(
            default=None,
            description="The description of the item",
            max_length=300,
        ),
    ]
    price: Annotated[
        float,
        Field(
            gt=0,
            description="The price must be greater than zero",
        ),
    ]
    tax: Annotated[
        float | None,
        Field(
            default=None,
            gt=0,
        ),
    ]


@app.post("/items")
def create_item(item: Annotated[Item, Body()]):
    return item.model_dump()

You can use the same properties as in Path and Query, including:

  • gt, ge, lt, le: Constraints for numeric values (gt=0 means greater than 0, ge=0 means greater than or equal to 0)
  • min_length, max_length: Constraints for string length (min_length=2, max_length=50)
  • regex: String validation using regular expressions (regex="^[a-zA-Z0-9_-]+$")

In addition to these, various other options are available. For more details, refer to the Pydantic official documentation.

Adding Extra Information Using Body()

You can use openapi_examples inside Body() to define example values that will be displayed in the API documentation.

from typing import Annotated

from nexify import Body, Nexify
from pydantic import BaseModel

app = Nexify()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


@app.post("/items")
def create_item(
    item: Annotated[
        Item,
        Body(
            openapi_examples={
                "simple_example": {
                    "summary": "Simple Example",
                    "description": "A simple example of a request to create an item",
                    "value": {
                        "name": "Item Name",
                        "description": "Item Description",
                        "price": 10.5,
                        "tax": 1.5,
                    },
                }
            },
        ),
    ],
):
    return item.model_dump()

In this case, you can see the example values in the API documentation.

Swagger UI

Info

You can also set a example value using Field(..., example=1234), but if you want to add more detailed examples to your OpenAPI documentation, it is recommended to use openapi_examples inside Body().