Filtering and sorting help you get just the data you want from a list or database. It makes your app faster and easier to use.
Filtering and sorting in FastAPI
from fastapi import FastAPI, Query from typing import List, Optional app = FastAPI() @app.get("/items/") async def read_items( q: Optional[str] = Query(None, min_length=3, max_length=50), sort_by: Optional[str] = Query(None, regex="^(name|price)$") ): # Your filtering and sorting logic here pass
Use Query to declare query parameters with validation.
Optional parameters can be used to filter or sort if provided.
from fastapi import FastAPI, Query from typing import Optional app = FastAPI() @app.get("/products/") async def get_products( category: Optional[str] = Query(None), sort_by: Optional[str] = Query(None, regex="^(price|name)$") ): return {"category": category, "sort_by": sort_by}
from fastapi import FastAPI app = FastAPI() items = [ {"name": "apple", "price": 5}, {"name": "banana", "price": 3}, {"name": "carrot", "price": 4} ] @app.get("/items/") async def read_items(sort_by: str = "name"): sorted_items = sorted(items, key=lambda x: x[sort_by]) return sorted_items
This FastAPI app has an endpoint /items/ that lets you filter items by a search term q and sort them by name or price. If you don't provide q, it returns all items sorted.
from fastapi import FastAPI, Query from typing import Optional app = FastAPI() items = [ {"name": "apple", "price": 5}, {"name": "banana", "price": 3}, {"name": "carrot", "price": 4} ] @app.get("/items/") async def read_items( q: Optional[str] = Query(None, min_length=1), sort_by: Optional[str] = Query("name", regex="^(name|price)$") ): # Filter items by name containing q if q is given filtered = [item for item in items if q.lower() in item["name"]] if q else items # Sort filtered items by sort_by key sorted_items = sorted(filtered, key=lambda x: x[sort_by]) return sorted_items
Use Optional with query parameters to make them optional.
Use Query to add validation like minimum length or regex patterns.
Sorting keys should be checked to avoid errors if invalid keys are passed.
Filtering lets you get only the data you want by checking conditions.
Sorting arranges data in order, like alphabetically or by number.
FastAPI makes it easy to add filtering and sorting with query parameters.
Practice
Solution
Step 1: Understand query parameters in FastAPI
Query parameters allow clients to send extra information to filter or sort data returned by the API.Step 2: Identify filtering and sorting purpose
Filtering selects data based on conditions, and sorting arranges data in a specific order.Final Answer:
To select only the data that meets certain conditions and order it -> Option AQuick Check:
Filtering and sorting = select and order data [OK]
- Confusing filtering with updating data
- Thinking sorting changes server settings
- Assuming query parameters create new endpoints
price in a FastAPI endpoint?Solution
Step 1: Recognize query parameter declaration
FastAPI uses function parameters with default values or Query() to declare query parameters.Step 2: Identify correct type and usage for sorting
Sorting fields are usually strings naming the field, sosort: str = Query(None)is correct.Final Answer:
def get_items(sort: str = Query(None)): -> Option BQuick Check:
Sort parameter is a string query [OK]
- Using int or bool for sorting parameter
- Naming parameter incorrectly (like price instead of sort)
- Not setting default or Query for optional params
sort is set to name?
from fastapi import FastAPI, Query
app = FastAPI()
items = [{"name": "apple", "price": 5}, {"name": "banana", "price": 3}, {"name": "cherry", "price": 7}]
@app.get("/items")
def get_items(sort: str = Query(None)):
if sort == "name":
return sorted(items, key=lambda x: x["name"])
return itemsSolution
Step 1: Understand sorting by name
The code sorts the list of items by the "name" key alphabetically whensort == "name".Step 2: Check alphabetical order of names
Names are "apple", "banana", "cherry" which is already sorted alphabetically.Final Answer:
[{"name": "apple", "price": 5}, {"name": "banana", "price": 3}, {"name": "cherry", "price": 7}] -> Option DQuick Check:
Sorted by name = original order [OK]
- Assuming sorting by name changes order when already sorted
- Confusing sorting by price instead of name
- Thinking output includes sorting description text
from fastapi import FastAPI
app = FastAPI()
items = [{"name": "apple", "price": 5}, {"name": "banana", "price": 3}]
@app.get("/items")
def get_items(min_price: int):
return [item for item in items if item["price"] > min_price]Solution
Step 1: Check parameter declaration
The parametermin_pricehas no default value, so it is required in the query.Step 2: Understand what happens if parameter missing
If the client does not providemin_price, FastAPI returns a 422 error because the parameter is missing.Final Answer:
The endpoint will fail ifmin_priceis not provided in the query -> Option CQuick Check:
Required query param missing causes failure [OK]
- Thinking comparison operator is wrong
- Believing list comprehension syntax is invalid
- Assuming items list is undefined
name or price. Which code snippet correctly implements this filtering and sorting logic?Solution
Step 1: Check filtering logic
def get_items(min_price: int = 0, sort: str = None): filtered = [item for item in items if item["price"] >= min_price] if sort == "name": return sorted(filtered, key=lambda x: x["name"]) elif sort == "price": return sorted(filtered, key=lambda x: x["price"]) return filtered filters items with price >= min_price, which is correct and uses a default value for optional param.Step 2: Check sorting logic
def get_items(min_price: int = 0, sort: str = None): filtered = [item for item in items if item["price"] >= min_price] if sort == "name": return sorted(filtered, key=lambda x: x["name"]) elif sort == "price": return sorted(filtered, key=lambda x: x["price"]) return filtered sorts filtered items by name or price if requested, otherwise returns filtered list.Step 3: Verify other options
def get_items(min_price: int, sort: str): filtered = [item for item in items if item["price"] > min_price] if sort == "name": return sorted(items, key=lambda x: x["name"]) return filtered does not sort by price and uses > instead of >=; def get_items(min_price: int = None, sort: str = "price"): filtered = [item for item in items if item["price"] > min_price] return sorted(filtered, key=lambda x: x[sort]) may fail if min_price is None; def get_items(min_price: int = 0, sort: str = None): filtered = [item for item in items if item["price"] >= min_price] if sort == "price": return sorted(filtered, key=lambda x: x["price"]) return filtered only sorts by price, missing name sorting.Final Answer:
Option A correctly filters and sorts by name or price with defaults -> Option AQuick Check:
Filter with default and conditional sort = def get_items(min_price: int = 0, sort: str = None): filtered = [item for item in items if item["price"] >= min_price] if sort == "name": return sorted(filtered, key=lambda x: x["name"]) elif sort == "price": return sorted(filtered, key=lambda x: x["price"]) return filtered [OK]
- Not providing default values for query parameters
- Sorting original list instead of filtered list
- Using > instead of >= for filtering
- Not handling both sorting options
Ready to prove it?
Pass the test and this pattern moves unknown
