5 - Query Parameter Models

5 - Query Parameter Models#

from typing import Annotated, Literal
from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

class FilterParams(BaseModel):
    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []


@app.get("/items8/")
async def read_items(filter_query: Annotated[FilterParams, Query()]):
    return filter_query
import requests
url = 'http://127.0.0.1:8000'
params = {
    
}
requests.get(url + '/items8', params=params).json()
{'limit': 100, 'offset': 0, 'order_by': 'created_at', 'tags': []}

Forbid Extra Query Parameters#

You can use Pydantic’s model configuration to restrict the query parameters you receive:

class FilterParams(BaseModel):
    model_config = {"extra": "forbid"}
    limit: int = Field(100, gt=0, le=100)
    offset: int = Field(0, ge=0)
    order_by: Literal["created_at", "updated_at"] = "created_at"
    tags: list[str] = []

This will return an error if a user tries to request an extra parameter in the query.