تكرار السؤال: …
الإجابة المختصرة
عرّف نماذج طلب ورد خاصة بالـ API (DTOs) للتحقق والـ serialization، وحوّلها إلى نماذج domain داخلية مستقلة، فلا يتسرب شكل JSON وأسماؤه إلى منطق العمل.
الشرح
الربط المباشر بين الاثنين يجعل أي تغيير في الـ API يكسر منطق العمل، ويعرّض حقولًا داخلية للخارج (مثل password_hash أو is_admin عند استقبال البيانات). الفصل يسمح بإصدارات متعددة للـ API على نفس الـ domain، وبإخفاء الحقول الحساسة في الرد. ارفض الحقول غير المتوقعة إذا كان ذلك جزءًا من عقد الأمان (لمنع mass assignment)، وأعد رسائل تحقق مفيدة.
مثال بالكود
from dataclasses import dataclass
from pydantic import BaseModel, ConfigDict, EmailStr
class CreateUserIn(BaseModel): # API schema
model_config = ConfigDict(extra="forbid")
email: EmailStr
display_name: str
@dataclass
class User: # domain model
email: str
name: str
is_admin: bool = False
def to_domain(payload: CreateUserIn) -> User:
return User(email=payload.email.lower(), name=payload.display_name)أخطاء شائعة
- استقبال نموذج قاعدة البيانات مباشرة من الطلب فيستطيع المستخدم تعديل is_admin.
- إرجاع نموذج قاعدة البيانات في الرد فتتسرب حقول حساسة.