Advanced Field Types
Specialized field types with built-in validation and formatting.
email
Email address with validation.
bash
-f email:email:required,uniqueGenerated Code
python
from pydantic import EmailStr
email: EmailStr = Field(unique=True, index=True)Validation
Automatically validates:
- Contains
@symbol - Valid domain format
- No invalid characters
url
URL with validation.
bash
-f website:url:nullable
-f callback_url:url:requiredGenerated Code
python
from pydantic import HttpUrl
website: Optional[HttpUrl] = Noneuuid
UUID for identifiers.
bash
-f public_id:uuid:uniqueGenerated Code
python
from uuid import UUID, uuid4
public_id: UUID = Field(default_factory=uuid4, unique=True)Use Cases
- Public-facing IDs (hide auto-increment)
- Distributed systems
- API identifiers
decimal
Precise decimal numbers.
bash
-f price:decimal:required
-f tax_rate:decimal:nullableGenerated Code
python
from decimal import Decimal
from sqlalchemy import Column, Numeric
price: Decimal = Field(sa_column=Column(Numeric(10, 2)))With Precision
bash
-f amount:decimal:required # Default: 10,2money
Currency amounts (alias for decimal with 2 places).
bash
-f price:money:required,min:0
-f discount:money:nullableGenerated Code
python
from decimal import Decimal
price: Decimal = Field(ge=Decimal('0'), decimal_places=2)percent
Percentage values (0-100).
bash
-f discount_percent:percent:default:0
-f tax_rate:percent:requiredGenerated Code
python
from decimal import Decimal
discount_percent: Decimal = Field(default=Decimal('0'), ge=0, le=100)date
Date without time.
bash
-f birth_date:date:nullable
-f due_date:date:requiredGenerated Code
python
from datetime import date
birth_date: Optional[date] = None
due_date: datetime
Time without date.
bash
-f start_time:time:required
-f end_time:time:requiredGenerated Code
python
from datetime import time
start_time: time
end_time: timephone
Phone number with validation.
bash
-f phone:phone:nullable
-f mobile:phone:requiredGenerated Code
python
phone: Optional[str] = Field(max_length=20, regex=r'^\+?[1-9]\d{1,14}$')slug
URL-friendly slug.
bash
-f slug:slug:required,unique,indexGenerated Code
python
slug: str = Field(unique=True, index=True, regex=r'^[a-z0-9]+(?:-[a-z0-9]+)*$')Auto-Generation
Consider auto-generating from title:
python
from slugify import slugify
class PostService(BaseService):
async def before_create(self, data: dict) -> dict:
if 'slug' not in data and 'title' in data:
data['slug'] = slugify(data['title'])
return dataip
IP address (v4 or v6).
bash
-f ip_address:ip:nullable
-f last_login_ip:ip:nullableGenerated Code
python
from ipaddress import IPv4Address, IPv6Address
from typing import Union
ip_address: Optional[Union[IPv4Address, IPv6Address]] = Nonejson
JSON/JSONB data.
bash
-f metadata:json:nullable
-f settings:json:default:{}Generated Code
python
from sqlalchemy import Column
from sqlalchemy.dialects.postgresql import JSONB
metadata: Optional[dict] = Field(sa_column=Column(JSONB))Use Cases
bash
-f preferences:json:nullable # User preferences
-f attributes:json:nullable # Product attributes
-f translations:json:nullable # i18n contentcolor
Hex color code.
bash
-f primary_color:color:default:#000000
-f background_color:color:nullableGenerated Code
python
primary_color: str = Field(default='#000000', regex=r'^#[0-9A-Fa-f]{6}$')file
File path/URL.
bash
-f document:file:nullable
-f attachment:file:nullableGenerated Code
python
document: Optional[str] = Field(max_length=500)image
Image path/URL (alias for file with image validation).
bash
-f avatar:image:nullable
-f cover_image:image:nullableGenerated Code
python
avatar: Optional[str] = Field(max_length=500)Foreign Keys
Reference other tables.
bash
-f user_id:integer:foreign:users.id
-f category_id:integer:foreign:categories.id,nullableGenerated Code
python
from sqlalchemy import ForeignKey
user_id: int = Field(foreign_key="users.id")
category_id: Optional[int] = Field(foreign_key="categories.id", nullable=True)With Relationships
python
from sqlmodel import Relationship
class Post(BaseModel, table=True):
user_id: int = Field(foreign_key="users.id")
user: Optional["User"] = Relationship(back_populates="posts")