تكرار السؤال: …
الإجابة المختصرة
تحوّل Pydantic البيانات الداخلة إلى نموذج typed وتتحقق منها وفق الـ type hints والقيود، وترمي ValidationError بكل الأخطاء معًا. في الوضع المرن الافتراضي تحوّل القيم المتوافقة (مثل "42" إلى int)، وفي الوضع الصارم ترفض أي نوع غير مطابق تمامًا.
الشرح
نواة التحقق في v2 مكتوبة بـ Rust (pydantic-core) فهي أسرع بكثير من v1. تتغير الواجهات: model_validate بدل parse_obj، و model_dump بدل dict، و field_validator بدل validator، و ConfigDict للإعدادات. استخدم Field للقيود (gt و max_length)، و extra="forbid" لرفض الحقول غير المتوقعة، و TypeAdapter للتحقق من أنواع ليست نماذج مثل list[int].
مثال بالكود
from pydantic import BaseModel, ConfigDict, Field, ValidationError, field_validator
class Product(BaseModel):
model_config = ConfigDict(extra="forbid")
name: str = Field(min_length=2)
price: float = Field(gt=0)
tags: list[str] = []
@field_validator("name")
@classmethod
def strip_name(cls, v: str) -> str:
return v.strip()
Product.model_validate({"name": " Tea ", "price": "12.5"}) # price يتحول إلى 12.5
try:
Product.model_validate({"name": "T", "price": -1, "color": "red"})
except ValidationError as err:
print(err.error_count()) # 3أخطاء شائعة
- استخدام واجهات v1 مثل .dict() و @validator في مشروع v2.
- الاعتماد على التحويل المرن لحقول يجب أن تكون صارمة مثل المبالغ أو المعرفات.