Bird
Raised Fist0
FastAPIframework~5 mins

Field validation rules in FastAPI

Choose your learning style10 modes available
Introduction

Field validation rules help check if the data sent to your API is correct and safe. They stop wrong or missing information before it causes problems.

When you want to make sure a user's email is in the right format.
When you need to check that a password is long enough.
When you want to limit a number to a certain range, like age between 1 and 120.
When you want to require some fields and make others optional.
When you want to give clear error messages if data is wrong.
Syntax
FastAPI
from pydantic import BaseModel, Field

class User(BaseModel):
    name: str = Field(..., min_length=2, max_length=50)
    age: int = Field(..., ge=1, le=120)
    email: str = Field(..., regex=r"^[\w\.-]+@[\w\.-]+\.\w{2,4}$")

Field(...) means the field is required.

You can add rules like min_length, max_length, ge (greater or equal), le (less or equal), and regex for patterns.

Examples
This example requires a product title with at least 3 characters and a price greater than 0.
FastAPI
from pydantic import BaseModel, Field

class Product(BaseModel):
    title: str = Field(..., min_length=3)
    price: float = Field(..., gt=0)
Here, username must match the pattern (letters, numbers, underscores). Bio is optional but limited to 200 characters.
FastAPI
from pydantic import BaseModel, Field

class User(BaseModel):
    username: str = Field(..., regex=r"^[a-zA-Z0-9_]+$")
    bio: str | None = Field(None, max_length=200)
Sample Program

This FastAPI app defines a User model with validation rules. When you send data to /users/, FastAPI checks the rules. If data is wrong, it returns clear errors. If data is good, it confirms user creation.

FastAPI
from fastapi import FastAPI
from pydantic import BaseModel, Field
from fastapi.responses import JSONResponse
from fastapi.requests import Request
from fastapi.exception_handlers import RequestValidationError

app = FastAPI()

class User(BaseModel):
    name: str = Field(..., min_length=2, max_length=50)
    age: int = Field(..., ge=1, le=120)
    email: str = Field(..., regex=r"^[\w\.-]+@[\w\.-]+\.\w{2,4}$")

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    return JSONResponse(
        status_code=422,
        content={"detail": exc.errors(), "body": exc.body},
    )

@app.post("/users/")
async def create_user(user: User):
    return {"message": f"User {user.name} created successfully!", "user": user.dict()}
OutputSuccess
Important Notes

Validation errors automatically return a 422 status with details.

Use Field(...) to make a field required, or Field(None) to make it optional.

Regex patterns must be raw strings (prefix with r) to avoid escape issues.

Summary

Field validation rules check data before your API uses it.

Use Field with options like min_length, max_length, ge, le, and regex.

FastAPI and Pydantic handle errors and give clear messages automatically.

Practice

(1/5)
1. What is the purpose of using Field with parameters like min_length or ge in FastAPI models?
easy
A. To validate and restrict input data before processing
B. To format the output data after processing
C. To create database tables automatically
D. To handle HTTP request routing

Solution

  1. Step 1: Understand Field usage in FastAPI

    Field is used to define extra validation rules on model fields.
  2. Step 2: Recognize validation purpose

    Parameters like min_length or ge ensure input data meets conditions before API logic runs.
  3. Final Answer:

    To validate and restrict input data before processing -> Option A
  4. Quick Check:

    Field validation = Input data check [OK]
Hint: Field with min_length or ge always validates input data [OK]
Common Mistakes:
  • Confusing validation with output formatting
  • Thinking Field creates database tables
  • Assuming Field controls routing
2. Which of the following is the correct way to enforce a string field to have at least 3 characters using FastAPI's Field?
easy
A. name: str = Field(length_min=3)
B. name: str = Field(min_length=3)
C. name: str = Field(min=3)
D. name: str = Field(minsize=3)

Solution

  1. Step 1: Recall correct parameter name for minimum length

    FastAPI uses min_length to set minimum string length.
  2. Step 2: Match option with correct syntax

    name: str = Field(min_length=3) uses min_length=3, which is correct syntax.
  3. Final Answer:

    name: str = Field(min_length=3) -> Option B
  4. Quick Check:

    min_length = min_length [OK]
Hint: Use min_length for strings, not min or length_min [OK]
Common Mistakes:
  • Using incorrect parameter names like min or length_min
  • Confusing min_length with min for numbers
  • Misspelling parameter names
3. Given this FastAPI model snippet:
from pydantic import BaseModel, Field

class User(BaseModel):
    age: int = Field(ge=18, le=65)

user = User(age=70)

What will happen when creating user?
medium
A. An error is raised because age is greater than 65
B. User instance is created with age 70 without error
C. Age is automatically set to 65
D. Age is ignored and set to default 0

Solution

  1. Step 1: Understand ge and le constraints

    ge=18 means age must be >=18, le=65 means age must be <=65.
  2. Step 2: Check provided age value

    Age 70 is greater than 65, violating the le constraint.
  3. Step 3: FastAPI/Pydantic behavior on violation

    It raises a validation error when constraints are not met.
  4. Final Answer:

    An error is raised because age is greater than 65 -> Option A
  5. Quick Check:

    ge/le constraints cause error if violated [OK]
Hint: ge and le set min/max values; violation raises error [OK]
Common Mistakes:
  • Assuming values auto-correct to limits
  • Thinking invalid values are ignored
  • Confusing ge/le with min_length/max_length
4. Identify the error in this FastAPI model field validation:
from pydantic import BaseModel, Field

class Product(BaseModel):
    code: str = Field(regex="[A-Z]{3}[0-9]{4}")

product = Product(code="abC1234")
medium
A. The code field should be an integer, not string
B. Field does not support regex parameter
C. The regex pattern is case-sensitive and input does not match
D. Missing default value for code field

Solution

  1. Step 1: Analyze regex pattern

    Pattern requires exactly 3 uppercase letters followed by 4 digits.
  2. Step 2: Check input against pattern

    Input "abC1234" has lowercase letters and does not fully match pattern.
  3. Step 3: Understand validation result

    Regex is case-sensitive by default, so input fails validation causing error.
  4. Final Answer:

    The regex pattern is case-sensitive and input does not match -> Option C
  5. Quick Check:

    Regex is case-sensitive unless flagged [OK]
Hint: Regex in Field is case-sensitive by default [OK]
Common Mistakes:
  • Assuming regex ignores case without flags
  • Thinking Field does not accept regex
  • Confusing data types for fields
5. You want to create a FastAPI model for a username that must be 5 to 10 characters long, only letters and digits allowed, and must start with a letter. Which Field validation is correct?
hard
A. username: str = Field(min_length=5, max_length=10, regex='^[0-9][a-zA-Z0-9]*$')
B. username: str = Field(min_length=5, max_length=10, regex='^[a-zA-Z]{5,10}$')
C. username: str = Field(min_length=5, max_length=10, regex='^[a-zA-Z0-9]{5,10}$')
D. username: str = Field(min_length=5, max_length=10, regex='^[a-zA-Z][a-zA-Z0-9]*$')

Solution

  1. Step 1: Check length constraints

    min_length=5 and max_length=10 ensure username length between 5 and 10.
  2. Step 2: Analyze regex pattern

    Regex '^[a-zA-Z][a-zA-Z0-9]*$' means username starts with a letter, followed by letters or digits.
  3. Step 3: Verify other options

    Options starting with a digit are incorrect. Options using regex '^[a-zA-Z0-9]{5,10}$' allow starting with digits. Options using '^[a-zA-Z]{5,10}$' exclude digits.
  4. Final Answer:

    username: str = Field(min_length=5, max_length=10, regex='^[a-zA-Z][a-zA-Z0-9]*$') -> Option D
  5. Quick Check:

    Start letter + length + allowed chars = username: str = Field(min_length=5, max_length=10, regex='^[a-zA-Z][a-zA-Z0-9]*$') [OK]
Hint: Start letter regex: ^[a-zA-Z], then allowed chars [OK]
Common Mistakes:
  • Allowing username to start with digit
  • Not enforcing length limits
  • Using regex that excludes digits or letters incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard