📖 Scenario: You are building a simple FastAPI app to manage a list of products. You want to add a feature that allows clients to add multiple products at once in a single request.
🎯 Goal: Create a FastAPI app that accepts a bulk list of products via a POST request and stores them in memory.
📋 What You'll Learn
Create a list called products to store product dictionaries
Define a Pydantic model called Product with fields id (int) and name (str)
Create a POST endpoint /add-products that accepts a list of Product items
Add the received products to the products list
💡 Why This Matters
🌍 Real World
Bulk operations are common in APIs to efficiently add or update many items at once, such as uploading multiple products to an online store.
💼 Career
Understanding how to handle bulk data input and output is essential for backend developers building scalable and user-friendly APIs.
Progress0 / 4 steps
1
Data Setup: Create the products list
Create a list called products initialized as an empty list to store product dictionaries.
FastAPI
Hint
Use products = [] to create an empty list.
2
Configuration: Define the Product model
Define a Pydantic model called Product with two fields: id of type int and name of type str.
FastAPI
Hint
Use class Product(BaseModel): and define the fields inside.
3
Core Logic: Create the FastAPI app and POST endpoint
Create a FastAPI app instance called app. Then create a POST endpoint /add-products that accepts a list of Product items as the request body parameter named new_products. Inside the endpoint, add each product from new_products to the products list as a dictionary using .dict().
FastAPI
Hint
Use for product in new_products: and append product.dict() to products.
4
Completion: Add a GET endpoint to view all products
Add a GET endpoint /products that returns the current products list.
FastAPI
Hint
Define a GET endpoint that returns the products list.
Practice
(1/5)
1. What is the main benefit of using bulk operations in FastAPI?
easy
A. They limit the number of items processed to one per request.
B. They automatically generate HTML forms for data input.
C. They encrypt data before sending it to the client.
D. They allow handling many items in a single request, reducing server calls.
Solution
Step 1: Understand bulk operations purpose
Bulk operations let you send many items at once instead of one by one.
Step 2: Identify the main benefit
This reduces the number of server calls and speeds up processing.
Final Answer:
They allow handling many items in a single request, reducing server calls. -> Option D
Quick Check:
Bulk operations = fewer server calls [OK]
Hint: Bulk means many items at once, not one by one [OK]
Common Mistakes:
Thinking bulk operations encrypt data
Confusing bulk with form generation
Assuming bulk limits to one item
2. Which of the following is the correct way to accept multiple items in a FastAPI endpoint using Pydantic models?
easy
A. def create_items(items: ItemModel[]):
B. def create_items(item: ItemModel):
C. def create_items(items: List[ItemModel]):
D. def create_items(items: Dict[ItemModel]):
Solution
Step 1: Recall FastAPI typing for multiple items
FastAPI uses Python typing List[Model] to accept multiple objects.
Step 2: Check each option's syntax
def create_items(items: List[ItemModel]): uses List[ItemModel], which is correct. def create_items(item: ItemModel): accepts one item only. def create_items(items: ItemModel[]): uses invalid syntax. def create_items(items: Dict[ItemModel]): uses Dict which is not for lists.
Final Answer:
def create_items(items: List[ItemModel]): -> Option C
Quick Check:
Multiple items = List[Model] [OK]
Hint: Use List[Model] to accept many items in FastAPI [OK]
Common Mistakes:
Using ItemModel[] which is invalid syntax
Using Dict instead of List for multiple items
Forgetting to import List from typing
3. Given this FastAPI endpoint:
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post('/items/')
async def create_items(items: List[Item]):
return {'count': len(items), 'names': [item.name for item in items]}
What will be the response if the client sends this JSON body?
The endpoint accepts a list of Item objects and returns count and names list.
Step 2: Analyze input JSON
The input has two items with names 'apple' and 'banana'.
Step 3: Predict output
Count is 2, names list contains both names.
Final Answer:
{"count": 2, "names": ["apple", "banana"]} -> Option B
Quick Check:
List length = 2, names extracted correctly [OK]
Hint: Count list length and extract names from each item [OK]
Common Mistakes:
Assuming only one item processed
Expecting validation error without reason
Returning empty list mistakenly
4. Identify the error in this FastAPI bulk operation endpoint:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
username: str
age: int
@app.post('/users/')
async def create_users(users: User):
return {'usernames': [user.username for user in users]}
medium
A. The parameter 'users' should be a list type like List[User].
B. The return statement should not use list comprehension.
C. The User model is missing required fields.
D. The endpoint path should be '/user/' not '/users/'.
Solution
Step 1: Check parameter type for bulk input
The parameter 'users' is typed as User, which accepts one object, not multiple.
Step 2: Identify correct typing for multiple users
To accept many users, it should be List[User] from typing module.
Final Answer:
The parameter 'users' should be a list type like List[User]. -> Option A
Quick Check:
Bulk input needs List[Model] type [OK]
Hint: Bulk input must be List[Model], not single Model [OK]
Common Mistakes:
Using single model instead of list for bulk
Thinking list comprehension causes error
Confusing endpoint path naming
5. You want to create a FastAPI endpoint that accepts a bulk list of products but only saves those with price greater than 10. Which code snippet correctly implements this filtering inside the endpoint?
hard
A. async def create_products(products: List[Product]):
filtered = [p for p in products if p.price > 10]
return {'saved': len(filtered)}
B. async def create_products(products: List[Product]):
filtered = [p for p in products if p.price < 10]
return {'saved': len(filtered)}
C. async def create_products(products: Product):
filtered = [p for p in products if p.price > 10]
return {'saved': len(filtered)}