Validation Rules
Complete reference for field validation rules.
required
Field must have a value (not null).
bash
-f title:string:requiredGenerated Code
python
title: str # No Optional, no defaultnullable
Field can be null.
bash
-f bio:text:nullable
-f deleted_at:datetime:nullableGenerated Code
python
from typing import Optional
bio: Optional[str] = None
deleted_at: Optional[datetime] = Noneunique
Create unique constraint.
bash
-f email:email:unique
-f sku:string:uniqueGenerated Code
python
email: str = Field(unique=True)Composite Unique
For multi-column uniqueness, add constraint manually:
python
from sqlalchemy import UniqueConstraint
class OrderItem(BaseModel, table=True):
__table_args__ = (
UniqueConstraint('order_id', 'product_id', name='unique_order_product'),
)index
Create database index for faster queries.
bash
-f email:email:index
-f slug:slug:unique,indexGenerated Code
python
email: str = Field(index=True)When to Index
- Columns used in
WHEREclauses - Columns used in
ORDER BY - Foreign key columns
- Columns used in
JOINconditions
max:N
Maximum length (strings) or value (numbers).
bash
-f title:string:max:200
-f age:integer:max:150
-f rating:float:max:5Generated Code
python
# String
title: str = Field(max_length=200)
# Integer
age: int = Field(le=150)
# Float
rating: float = Field(le=5.0)min:N
Minimum length (strings) or value (numbers).
bash
-f password:string:min:8
-f age:integer:min:0
-f price:decimal:min:0Generated Code
python
# String - uses validator
password: str = Field(min_length=8)
# Integer
age: int = Field(ge=0)
# Decimal
price: Decimal = Field(ge=Decimal('0'))default:V
Set default value.
bash
-f status:string:default:draft
-f is_active:boolean:default:true
-f count:integer:default:0
-f role:string:default:userGenerated Code
python
status: str = Field(default="draft")
is_active: bool = Field(default=True)
count: int = Field(default=0)
role: str = Field(default="user")Special Defaults
bash
# Current timestamp
-f created_at:datetime:default:now
# Empty JSON
-f metadata:json:default:{}
# Empty array (JSON)
-f tags:json:default:[]foreign:table.column
Create foreign key relationship.
bash
-f user_id:integer:foreign:users.id
-f category_id:integer:foreign:categories.id,nullableGenerated Code
python
user_id: int = Field(foreign_key="users.id")
category_id: Optional[int] = Field(foreign_key="categories.id", nullable=True)Cascade Options
Add cascade behavior manually:
python
from sqlalchemy import ForeignKey
user_id: int = Field(
sa_column=Column(
Integer,
ForeignKey("users.id", ondelete="CASCADE")
)
)Combining Rules
Rules can be combined with commas:
bash
# Required, unique, with max length
-f email:email:required,unique,max:255
# Nullable with default
-f role:string:nullable,default:user
# Required, indexed, with constraints
-f price:decimal:required,index,min:0
# Foreign key, nullable
-f parent_id:integer:foreign:categories.id,nullableRule Precedence
requiredandnullableare mutually exclusivedefaultmakes field optional (not required)uniqueimpliesindexin most cases- Type-specific validation is always applied
Validation Examples
User Model
bash
fastpy make:model User \
-f email:email:required,unique,index \
-f password:string:required,min:8 \
-f username:string:required,unique,max:50 \
-f is_active:boolean:default:true \
-f role:string:default:user \
-f email_verified_at:datetime:nullableProduct Model
bash
fastpy make:model Product \
-f name:string:required,max:200 \
-f sku:string:required,unique,max:50 \
-f price:money:required,min:0 \
-f sale_price:money:nullable \
-f quantity:integer:default:0,min:0 \
-f is_active:boolean:default:true \
-f category_id:integer:foreign:categories.idOrder Model
bash
fastpy make:model Order \
-f order_number:string:required,unique,index \
-f user_id:integer:required,foreign:users.id \
-f status:string:default:pending \
-f total:money:required,min:0 \
-f notes:text:nullable \
-f shipped_at:datetime:nullable \
-f delivered_at:datetime:nullable