📖 Scenario: You are building a simple API to register users. Each user has a name, age, and email. You want to make sure the data received is correct and follows some rules.
🎯 Goal: Create a FastAPI app with a User model that uses field types and constraints to validate incoming data.
📋 What You'll Learn
Use Pydantic BaseModel to define a User model
Add a name field as a string with a minimum length of 3
Add an age field as an integer with a minimum value of 18
Add an email field as a string that must be a valid email
Create a POST endpoint /users/ that accepts a User and returns it
💡 Why This Matters
🌍 Real World
APIs often need to validate incoming data to ensure it is correct and safe before processing. Using field types and constraints helps catch errors early and improves reliability.
💼 Career
Backend developers use FastAPI and Pydantic models to build robust APIs that validate user input and enforce data rules, which is essential for professional web services.
Progress0 / 4 steps
1
Create the User model with basic fields
Create a Pydantic model called User with these fields: name as str, age as int, and email as str.
FastAPI
Hint
Define a class User that inherits from BaseModel. Add the fields with their types inside.
2
Add constraints to the User model fields
Modify the User model to add these constraints: name must have a minimum length of 3, age must be at least 18, and email must be a valid email using EmailStr from pydantic.
FastAPI
Hint
Use Field to add min_length=3 for name and ge=18 for age. Use EmailStr type for email.
3
Create the POST endpoint to receive User data
Create a POST endpoint at /users/ that accepts a User object in the request body and returns the same User object.
FastAPI
Hint
Use @app.post('/users/') decorator and define an async function create_user that takes a User parameter and returns it.
4
Add response model and run the FastAPI app
Modify the POST endpoint to specify the response model as User. Add the code to run the FastAPI app with uvicorn if the script is run directly.
FastAPI
Hint
Add response_model=User to the POST decorator. Use if __name__ == '__main__': block to run uvicorn.run() with host and port.
Practice
(1/5)
1. In FastAPI, what is the main purpose of using Field() in a Pydantic model?
easy
A. To define API routes
B. To create database tables automatically
C. To add validation rules and metadata to model fields
D. To handle HTTP requests directly
Solution
Step 1: Understand the role of Pydantic models in FastAPI
Pydantic models define the data structure and validation for request and response data.
Step 2: Identify what Field() adds
Field() allows adding constraints like min/max length, default values, and descriptions to model fields.
Final Answer:
To add validation rules and metadata to model fields -> Option C
Quick Check:
Field() = validation and metadata [OK]
Hint: Field() is for validation and extra info on model fields [OK]
Common Mistakes:
Thinking Field() creates routes or handles requests
Confusing Field() with database table creation
Assuming Field() is for HTTP methods
2. Which of the following is the correct way to require a string field with a minimum length of 3 in a Pydantic model using Field()?
easy
A. name: str = Field(required=True, length=3)
B. name: str = Field(min=3)
C. name: str = Field(length=3)
D. name: str = Field(min_length=3)
Solution
Step 1: Recall the correct parameter for minimum length in Field()
The correct parameter to set minimum string length is min_length.
Step 2: Check each option for correct syntax
name: str = Field(min_length=3) uses min_length=3, which is correct. Others use invalid or incorrect parameters.
Final Answer:
name: str = Field(min_length=3) -> Option D
Quick Check:
Minimum string length uses min_length [OK]
Hint: Use min_length for string length constraints in Field() [OK]
Common Mistakes:
Using min instead of min_length for strings
Using length instead of min_length
Adding required=True which is not a Field() parameter
3. Given this Pydantic model snippet:
from pydantic import BaseModel, Field
class Item(BaseModel):
price: float = Field(gt=0)
name: str = Field(min_length=2, max_length=10)
What happens if you create Item(price=-5, name='A')?
medium
A. Validation error because price is not greater than 0 and name is too short
B. Item is created successfully with given values
C. Validation error only for price, name is accepted
D. Validation error only for name, price is accepted
Solution
Step 1: Check the constraints on price
Price must be greater than 0 (gt=0). Given price is -5, which fails this.
Step 2: Check the constraints on name
Name must have length between 2 and 10. Given name is 'A' (length 1), which fails min_length=2.
Final Answer:
Validation error because price is not greater than 0 and name is too short -> Option A
Quick Check:
Both price and name fail constraints [OK]
Hint: Check all Field constraints; both price and name fail here [OK]
Common Mistakes:
Assuming only one field causes error
Ignoring min_length constraint on strings
Thinking negative price passes gt=0
4. What is wrong with this FastAPI Pydantic model field definition?
from pydantic import BaseModel, Field
class User(BaseModel):
age: int = Field(min_length=18)
medium
A. Field cannot be used with integers
B. min_length is invalid for integer fields
C. Missing default value for age
D. Age should be a string, not int
Solution
Step 1: Understand Field constraints for int type
Integer fields use gt or ge for minimum value, not min_length.
Step 2: Identify the error in the code
Using min_length on an int field causes a validation error because it applies only to strings or collections.
Final Answer:
min_length is invalid for integer fields -> Option B
Quick Check:
min_length applies to strings, not ints [OK]
Hint: Use gt/ge for numbers, min_length for strings only [OK]
Common Mistakes:
Using string constraints on numeric fields
Thinking Field() can't be used with int
Confusing default value requirement
5. You want to create a FastAPI model for a product with a tags field that must be a list of strings, each string at least 2 characters long. Which is the best way to enforce this using Pydantic Field()?
hard
A. from typing import List
from pydantic import BaseModel, Field, conlist, constr
class Product(BaseModel):
tags: conlist(constr(min_length=2))
B. from typing import List
from pydantic import BaseModel, Field
class Product(BaseModel):
tags: List[str] = Field(min_length=2)
C. from typing import List
from pydantic import BaseModel, Field
class Product(BaseModel):
tags: List[str] = Field(min_items=2)
D. from typing import List
from pydantic import BaseModel, Field
class Product(BaseModel):
tags: List[str] = Field(min_length=2, max_length=10)
Solution
Step 1: Understand the requirement for list of strings with string length constraints
We need to enforce each string in the list to have at least 2 characters.
Step 2: Identify how to apply constraints on list items
Pydantic's constr can constrain strings, and conlist can constrain lists of constrained types.
Step 3: Evaluate options
from typing import List
from pydantic import BaseModel, Field, conlist, constr
class Product(BaseModel):
tags: conlist(constr(min_length=2)) uses conlist(constr(min_length=2)) which correctly enforces each string's min length inside the list. Others either apply min_length to the list itself or incorrectly.
Final Answer:
Use conlist with constr to enforce string length inside list -> Option A