Bird
Raised Fist0
FastAPIframework~10 mins

Custom validators in FastAPI - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Custom validators
Define Pydantic Model
↓
Add Custom Validator Method
↓
Receive Input Data
↓
Pydantic Validates Fields
↓
Custom Validator Runs
↓
Pass
↓
Model Created
↓
Use Validated Data
The flow shows how FastAPI uses Pydantic models with custom validators to check input data, either accepting it or raising errors.
Execution Sample
FastAPI
from pydantic import BaseModel, validator

class User(BaseModel):
    name: str
    age: int

    @validator('age')
    def age_must_be_adult(cls, v):
        if v < 18:
            raise ValueError('Must be at least 18')
        return v
This code defines a User model with a custom validator to ensure age is at least 18.
Execution Table
StepInput DataValidator CheckResultAction
1{'name': 'Alice', 'age': 20}age >= 18?TrueCreate User instance
2{'name': 'Bob', 'age': 16}age >= 18?FalseRaise ValidationError
3ValidationError caught--Return error response
💡 Execution stops when input passes validation or raises ValidationError on failure.
Variable Tracker
VariableStartAfter Step 1After Step 2Final
input_data-{'name': 'Alice', 'age': 20}{'name': 'Bob', 'age': 16}-
age-2016-
validation_result-PassedFailed-
user_instanceNoneUser(name='Alice', age=20)None-
Key Moments - 2 Insights
Why does the validator raise an error when age is less than 18?
Because the custom validator method explicitly checks if age < 18 and raises ValueError, as shown in execution_table row 2.
What happens if the input data passes the custom validator?
The model instance is created successfully with validated data, as shown in execution_table row 1.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the validation result for input {'name': 'Alice', 'age': 20}?
AError raised
BPassed
CFailed
DSkipped
💡 Hint
Check execution_table row 1 under 'Result' column.
At which step does the ValidationError occur?
AStep 2
BStep 1
CStep 3
DNo error occurs
💡 Hint
Look at execution_table row 2 where validation fails and error is raised.
If the age validator allowed ages less than 18, how would the user_instance variable change after step 2?
AIt would raise an error
BIt would be None
CIt would hold User instance with age 16
DIt would be deleted
💡 Hint
Refer to variable_tracker row for user_instance and consider if validation passes.
Concept Snapshot
Custom validators in FastAPI use Pydantic's @validator decorator.
They check or transform input fields during model creation.
If validation fails, a ValidationError is raised.
If it passes, the model instance is created with clean data.
Use them to enforce rules like minimum age or format.
Full Transcript
This visual execution shows how FastAPI uses Pydantic models with custom validators to check input data. First, a model is defined with fields and a custom validator method. When input data arrives, Pydantic validates each field. The custom validator runs for the specified field, checking conditions like age >= 18. If the condition passes, the model instance is created and can be used safely. If it fails, a ValidationError is raised, stopping the process and returning an error. Variables like input data, age, validation result, and model instance change step by step, showing how data flows and validation controls acceptance or rejection.

Practice

(1/5)
1. What is the main purpose of using @validator in FastAPI models?
easy
A. To connect the model to a database
B. To automatically generate API documentation
C. To add custom rules that check if input data is valid
D. To style the API response format

Solution

  1. Step 1: Understand the role of @validator

    The @validator decorator is used to add custom validation logic to model fields in FastAPI.
  2. Step 2: Identify the purpose of validation

    Validation ensures that the data meets specific rules before the app processes it, helping keep input correct and safe.
  3. Final Answer:

    To add custom rules that check if input data is valid -> Option C
  4. Quick Check:

    Custom validation = check input rules [OK]
Hint: Validators check data rules before use [OK]
Common Mistakes:
  • Confusing validators with database connectors
  • Thinking validators generate docs
  • Assuming validators change response style
2. Which of the following is the correct way to define a custom validator for a Pydantic model field named age?
easy
A. @validator('age')\ndef check_age(cls, value):
B. def validate_age(cls, value):
C. @validate('age')\ndef age_validator(cls, value):
D. @validate_field('age')\ndef age_check(cls, value):

Solution

  1. Step 1: Recall the correct decorator syntax

    FastAPI uses Pydantic's @validator decorator with the field name as a string argument.
  2. Step 2: Match the function definition style

    The validator function must be a class method with parameters cls and value.
  3. Final Answer:

    @validator('age')\ndef check_age(cls, value): -> Option A
  4. Quick Check:

    Use @validator('field') with cls, value [OK]
Hint: Use @validator('field') decorator for custom checks [OK]
Common Mistakes:
  • Using @validate instead of @validator
  • Missing the field name in decorator
  • Wrong function parameters
3. Given this code snippet, what will be the output if age is set to 15?
from pydantic import BaseModel, validator

class User(BaseModel):
    age: int

    @validator('age')
    def check_age(cls, value):
        if value < 18:
            raise ValueError('Must be 18 or older')
        return value

try:
    user = User(age=15)
except Exception as e:
    print(e)
medium
A. Must be 18 or older
B. TypeError because age is int
C. User object with age 15 is created
D. No output, code runs silently

Solution

  1. Step 1: Analyze the validator logic

    The validator checks if age is less than 18 and raises a ValueError if true.
  2. Step 2: Check the input value

    Since age=15 is less than 18, the validator raises the error.
  3. Final Answer:

    Must be 18 or older -> Option A
  4. Quick Check:

    Age < 18 triggers ValueError [OK]
Hint: Validator raises error if condition fails [OK]
Common Mistakes:
  • Assuming object creates despite validation error
  • Confusing ValueError with TypeError
  • Ignoring the exception handling block
4. Identify the error in this custom validator code:
from pydantic import BaseModel, validator

class Product(BaseModel):
    price: float

    @validator('price')
    def check_price(value):
        if value <= 0:
            raise ValueError('Price must be positive')
        return value
medium
A. Validator method must return None
B. Missing cls parameter in validator method
C. Price field should be int, not float
D. Validator decorator should be @validate

Solution

  1. Step 1: Check validator method signature

    Validator methods must accept cls as the first parameter, then value.
  2. Step 2: Identify missing parameter

    The method check_price only has value, missing cls.
  3. Final Answer:

    Missing cls parameter in validator method -> Option B
  4. Quick Check:

    Validator needs cls, value parameters [OK]
Hint: Validator methods need cls first, then value [OK]
Common Mistakes:
  • Omitting cls parameter
  • Using wrong decorator name
  • Returning None instead of value
5. You want to create a custom validator that ensures a username is lowercase and at least 3 characters long. Which code correctly implements this in a FastAPI Pydantic model?
from pydantic import BaseModel, validator

class User(BaseModel):
    username: str

    @validator('username')
    def validate_username(cls, value):
        # Fill in validation logic here
        pass
hard
A. if len(value) < 3 and not value.islower():\n raise ValueError('Username must be lowercase and 3+ chars')\nreturn value
B. if len(value) < 3 and value.islower():\n raise ValueError('Username too short')\nreturn value
C. if len(value) > 3 and value.islower():\n return value\nelse:\n raise ValueError('Invalid username')
D. if value.islower() and len(value) >= 3:\n return value\nraise ValueError('Username invalid')

Solution

  1. Step 1: Understand validation requirements

    The username must be lowercase and at least 3 characters long.
  2. Step 2: Check each option logic

    if value.islower() and len(value) >= 3:\n return value\nraise ValueError('Username invalid') correctly checks both conditions and raises error if not met, returning value otherwise.
  3. Final Answer:

    if value.islower() and len(value) >= 3:\n return value\nraise ValueError('Username invalid') -> Option D
  4. Quick Check:

    Check both conditions, raise error if false [OK]
Hint: Check all conditions with 'and', raise error if false [OK]
Common Mistakes:
  • Using 'or' instead of 'and' causing wrong logic
  • Returning value inside else but missing return in if
  • Incorrect length comparison operators
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