15 - Response Model: Return Type#

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None
    tags: list[str] = []

@app.post("/items/")
async def create_item(item: Item) -> Item:
    return item

@app.get("/items/")
async def read_items() -> list[Item]:
    return [
        Item(name="Portal Gun", price=42.0),
        Item(name="Plumbus", price=32.0),
    ]
import requests
url = 'http://127.0.0.1:8000'
data = {
    'name': 'Wireless Mouse',
    'price': 12.0,
    'tags': ['wireless', 'usb', 'black']
}
requests.post(url + '/items14', json=data).json()
{'name': 'Wireless Mouse',
 'description': None,
 'price': 12.0,
 'tax': None,
 'tags': ['wireless', 'usb', 'black']}
requests.get(url + '/items14').json()
[{'name': 'Portal Gun',
  'description': None,
  'price': 42.0,
  'tax': None,
  'tags': []},
 {'name': 'Plumbus',
  'description': None,
  'price': 32.0,
  'tax': None,
  'tags': []}]

The response_model Parameter#

The response_model parameter is a parameter of the decorator method that specifies the return type while allowing other data to be returned by the endpoint.

from typing import Any

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None
    tags: list[str] = []

@app.post("/items/", response_model=Item)
async def create_item(item: Item) -> Any:
    return item

@app.get("/items/", response_model=list[Item])
async def read_items() -> Any:
    return [
        {"name": "Portal Gun", "price": 42.0},
        {"name": "Plumbus", "price": 32.0},
    ]
data = {
    'name': 'Wireless Mouse',
    'price': 12.0,
    'tags': ['wireless', 'usb', 'black']
}
requests.post(url + '/items15', json=data).json()
{'name': 'Wireless Mouse',
 'description': None,
 'price': 12.0,
 'tax': None,
 'tags': ['wireless', 'usb', 'black']}
requests.get(url + '/items15').json()
[{'name': 'Portal Gun',
  'description': None,
  'price': 42.0,
  'tax': None,
  'tags': []},
 {'name': 'Plumbus',
  'description': None,
  'price': 32.0,
  'tax': None,
  'tags': []}]

Automatically Filtering Data from the Output Using response_model#

class UserIn(BaseModel):
    username: str
    password: str
    full_name: str | None = None

class UserOut(BaseModel):
    username: str
    full_name: str | None = None

@app.post("/user/", response_model=UserOut)
async def create_user(user: UserIn) -> Any:
    return user
data = {
    'username': 'GottaKetchumAll',
    'password': 'PikaPika25',
    'full_name': 'Ash Ketchum'
}
requests.post(url + '/user', json=data).json()
{'username': 'GottaKetchumAll', 'full_name': 'Ash Ketchum'}