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'}