Discover how a simple decorator can save you hours of debugging and messy code!
Why Custom validation with validator decorator in FastAPI? - Purpose & Use Cases
Imagine you have a form where users enter their birthdate, and you want to check if they are at least 18 years old. You write code everywhere to check this manually for every input.
Manually checking validation in many places leads to repeated code, mistakes, and inconsistent rules. It's easy to forget a check or write it differently each time.
The validator decorator lets you write validation logic once inside your data model. FastAPI runs it automatically whenever data is received, keeping your code clean and consistent.
if user.birthdate > today - timedelta(days=18*365): raise ValueError('Must be 18 or older')
@validator('birthdate') def check_age(cls, v): from datetime import datetime, timedelta today = datetime.today().date() if v > today - timedelta(days=18*365): raise ValueError('Must be 18 or older') return v
This makes your app safer and easier to maintain by centralizing all validation rules in one place.
When building a signup form, you can ensure all user inputs meet your rules without repeating checks in every route or function.
Manual validation is repetitive and error-prone.
The validator decorator centralizes validation logic.
This leads to cleaner, safer, and more maintainable code.
Practice
@validator decorator in a Pydantic model within FastAPI?Solution
Step 1: Understand the role of
The@validator@validatordecorator is used inside Pydantic models to add custom validation logic for fields.Step 2: Differentiate from other functionalities
It does not generate routes, define database relations, or format output JSON; those are handled elsewhere.Final Answer:
To add custom validation logic for model fields -> Option CQuick Check:
Custom validation = To add custom validation logic for model fields [OK]
- Confusing validation with route creation
- Thinking it formats output JSON
- Assuming it manages database relations
email in a Pydantic model?Solution
Step 1: Identify correct decorator usage
The correct decorator is@validator('field_name')with the field name as a string.Step 2: Check syntax correctness
@validator('email')\ndef check_email(cls, value):\n return value uses@validator('email')correctly; others use wrong decorator names or syntax.Final Answer:
@validator('email')\ndef check_email(cls, value):\n return value -> Option DQuick Check:
Correct decorator syntax = @validator('email')\ndef check_email(cls, value):\n return value [OK]
- Omitting quotes around field name
- Using wrong decorator name like @validate
- Using brackets [] instead of parentheses ()
age=15?
from pydantic import BaseModel, validator
class User(BaseModel):
age: int
@validator('age')
def check_age(cls, v):
if v < 18:
raise ValueError('Must be at least 18')
return v
user = User(age=15)Solution
Step 1: Analyze the validator logic
The validator checks ifageis less than 18 and raises aValueErrorif true.Step 2: Apply input value to validator
Sinceage=15is less than 18, the validator raises the error with the message.Final Answer:
A ValueError is raised with message 'Must be at least 18' -> Option AQuick Check:
Age < 18 triggers ValueError = A ValueError is raised with message 'Must be at least 18' [OK]
- Assuming instance is created despite validation error
- Thinking age auto-corrects to 18
- Confusing ValueError with TypeError
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 valueSolution
Step 1: Check validator method signature
Validator methods must haveclsas the first parameter, then the value.Step 2: Identify missing parameter
The method only hasvalue, missingcls, causing a TypeError.Final Answer:
Missingclsparameter in validator method -> Option BQuick Check:
Validator method needs cls first = Missingclsparameter in validator method [OK]
- Omitting cls parameter
- Using wrong decorator name
- Forgetting to return the value
username field to ensure it is at least 3 characters long and contains only letters and numbers. Which validator implementation correctly achieves this?Solution
Step 1: Check length and character conditions
The username must be at least 3 characters and only letters or numbers.Step 2: Evaluate each option's validation logic
from pydantic import BaseModel, validator import re class User(BaseModel): username: str @validator('username') def valid_username(cls, v): if len(v) < 3 or not re.match(r'^[a-zA-Z0-9]+$', v): raise ValueError('Username must be 3+ chars and alphanumeric') return v correctly checks length & uses regex to allow letters and numbers only. Others either check wrong conditions or restrict letters only.Final Answer:
Option A correctly validates username length and alphanumeric characters -> Option AQuick Check:
Length >=3 and alphanumeric = from pydantic import BaseModel, validator import re class User(BaseModel): username: str @validator('username') def valid_username(cls, v): if len(v) < 3 or not re.match(r'^[a-zA-Z0-9]+$', v): raise ValueError('Username must be 3+ chars and alphanumeric') return v [OK]
- Using isalpha() instead of isalnum()
- Checking length incorrectly (greater than vs less than)
- Restricting to letters only when numbers allowed
Ready to prove it?
Pass the test and this pattern moves unknown
