در Pydantic دو مفهوم بسیار مهم برای کنترل وضعیت فیلدها وجود دارد: Default Value (مقدار پیشفرض) و Nullable (قابل Null بودن – پذیرش مقدار None). این دو موضوع تعیین میکنند یک فیلد در هنگام ساخت مدل چگونه رفتار کند و آیا مقداردهی برای آن الزامی است یا خیر.
۱. Default Value — مقدار پیشفرض
اگر برای یک فیلد مقدار پیشفرض تعریف کنیم، آن فیلد دیگر اجباری نیست؛ یعنی لازم نیست هنگام ساخت مدل مقدار آن را بدهیم. Pydantic در صورت نبود مقدار، از مقدار پیشفرض استفاده میکند.
مثال:
from pydantic import BaseModel
class User(BaseModel):
age: int = 18
active: bool = True
# هیچ مقداری برای age و active ارسال نمیشود
User()
در این مثال:
ageمقدار پیشفرض ۱۸ دارد.activeمقدار پیشفرض True دارد.- بنابراین فیلدها «اختیاری» میشوند اما مقدار آنها None نیست، بلکه مقدار مشخصی دارند.
۲. Nullable — پذیرش مقدار None
nullable یعنی فیلد میتواند مقدار None داشته باشد. برای nullable بودن باید نوع فیلد اجازه پذیرش None داشته باشد.
راههای nullable کردن فیلد:
- استفاده از
Optional[type] - استفاده از
type | None(روش جدید در پایتون 3.10+)
مثال:
from typing import Optional
from pydantic import BaseModel
class User(BaseModel):
nickname: Optional[str] # میتواند None باشد
bio: str | None # روش جدیدتر
User(nickname=None, bio=None)
نکته بسیار مهم: nullable بودن با داشتن مقدار پیشفرض تفاوت دارد.
۳. تفاوت Default Value با Nullable
| ویژگی | Default Value | Nullable |
|---|---|---|
| نیاز به مقداردهی هنگام ساخت مدل | خیر (چون مقدار پیشفرض دارد) | خیر (چون میتواند None باشد) |
| نوع مقدار | همیشه مقدار واقعی دارد (نه None) | ممکن است None باشد |
| مثال | age: int = 18 |
nickname: str | None |
۴. حالتهای مختلف مقدار پیشفرض + nullable
الف) بدون مقدار پیشفرض و nullable
class User(BaseModel):
nickname: str | None
User(nickname=None) # OK
User() # ❌ نیاز به مقدار (چون پیشفرض ندارد)
ب) nullable با مقدار پیشفرض
class User(BaseModel):
nickname: str | None = None
User() # OK
User(nickname=None) # OK
در این حالت:
- فیلد nullable است
- مقدار پیشفرض هم دارد
- بنابراین کاملاً «غیراجباری» است
نتیجهگیری:
- Default Value ⇒ فیلد بدون مقدار هم مقدار دارد (غیراجباری ولی غیر None)
- Nullable ⇒ فیلد میتواند مقدار None بگیرد
- این دو کاملاً مستقلاند و میتوانند با هم ترکیب شوند