How to Implement Filtering in FastAPI: Simple Guide
To implement filtering in
FastAPI, define query parameters in your endpoint function that represent filter criteria. Use these parameters to filter your data source before returning results, optionally leveraging Pydantic models for validation and clarity.Syntax
In FastAPI, filtering is done by adding query parameters to your endpoint function. These parameters can be optional and have default values. You then use these parameters to filter your data.
Example parts:
param: type = Nonemeans the filter is optional.- Use
Queryfromfastapito add metadata or validation. - Filter your data inside the function using these parameters.
python
from fastapi import FastAPI, Query from typing import Optional app = FastAPI() @app.get("/items/") async def read_items( name: Optional[str] = Query(None, description="Filter by item name"), max_price: Optional[float] = Query(None, description="Filter by max price") ): # Imagine this is your data source items = [ {"name": "apple", "price": 5}, {"name": "banana", "price": 3}, {"name": "cherry", "price": 7} ] filtered = [] for item in items: if name and name.lower() not in item["name"].lower(): continue if max_price and item["price"] > max_price: continue filtered.append(item) return filtered
Example
This example shows a FastAPI app with an endpoint /items/ that filters items by optional name and max_price query parameters. It returns only items matching the filters.
python
from fastapi import FastAPI, Query from typing import Optional app = FastAPI() items = [ {"name": "apple", "price": 5}, {"name": "banana", "price": 3}, {"name": "cherry", "price": 7} ] @app.get("/items/") async def read_items( name: Optional[str] = Query(None, description="Filter by item name"), max_price: Optional[float] = Query(None, description="Filter by max price") ): filtered = [] for item in items: if name and name.lower() not in item["name"].lower(): continue if max_price and item["price"] > max_price: continue filtered.append(item) return filtered
Output
GET /items/?name=ap&max_price=6
[
{"name": "apple", "price": 5}
]
Common Pitfalls
Common mistakes when implementing filtering in FastAPI include:
- Not making query parameters optional, causing errors if filters are not provided.
- Not validating or sanitizing input, which can cause unexpected behavior.
- Filtering data inefficiently inside the endpoint, which can slow down response times.
- Ignoring case sensitivity when filtering strings.
Always use Optional types and consider using Query for validation and documentation.
python
from fastapi import FastAPI app = FastAPI() # Wrong: query parameters are required, causing errors if missing @app.get("/items/") async def read_items(name: str, max_price: float): # This will fail if parameters are not provided pass # Right: make parameters optional with defaults from typing import Optional from fastapi import Query @app.get("/items/") async def read_items( name: Optional[str] = Query(None), max_price: Optional[float] = Query(None) ): pass
Quick Reference
Tips for filtering in FastAPI:
- Use
Optionalquery parameters for filters. - Use
Queryto add descriptions and validation. - Filter your data inside the endpoint function before returning.
- Consider case-insensitive filtering for strings.
- For complex filters, use Pydantic models to group parameters.
Key Takeaways
Use optional query parameters to implement filtering in FastAPI endpoints.
Leverage Query from fastapi for validation and documentation of filters.
Filter your data inside the endpoint function based on query parameter values.
Make string filters case-insensitive for better user experience.
Avoid required query parameters unless absolutely necessary to prevent errors.