Django / أساس الطلب والبيانات / الدرس 6
النماذج والمخطط وتاريخ الترحيل
افصل تعريف النموذج وقيد القاعدة والتحقق وتاريخ الترحيل المراجع الرابط بينها.
في هذه الصفحة
أهداف الدرس
- النموذج أكثر من سجل Python
- عينة تخزين كاملة قابلة للاستغناء
- مراجعة انتقال المخطط والبيانات معا
النموذج أكثر من سجل Python
يعلن النموذج حقولا وعلاقات للتخزين بمحركه. تحمل الحقول المعنى؛ فالمعرف النصي ليس كمية والمقاعد لها سياسة غير سالبة. تختلف null وblank والافتراضي والفردية والحذف. لا تختر افتراضا يسهل الترحيل ويختلق بيانات كاذبة. صف الثابت قبل ترميزه. يتعاون النموذج والنموذج الإدخالي والقاعدة ولا يعوض أحدها الجميع. ومن المهم ألا يتحول الافتراضي الذي اختير لسهولة التطبيق إلى معلومة تجارية كاذبة عن الصفوف الموجودة، خاصة عندما يكون الحقل الجديد مطلوبا.
الحفظ لا ينفذ التحقق الكامل تلقائيا
تستطيع full_clean تحقق النموذج ولا تستدعيها save العادية تلقائيا. يغطي ModelForm حقوله بدورته وتختلف العمليات الجماعية والتحديث المباشر. تبقى القيود ضرورية للتزامن والمسارات الأخرى؛ فلا يحجز فحص الفردية القيمة. عالج رفض القيد. تفيد choices التحقق والعرض ولا تعني قيدا مستقلا بكل محرك. وتبقى القواعد المطبقة في النموذج مختلفة عن القيود التي ينفذها المحرك، ولذلك يجب اختبار المسارات الجماعية أو البديلة التي قد لا تمر بالتحقق نفسه.
عينة تخزين كاملة قابلة للاستغناء
يعلن البرنامج Course بمعرف تطبيق تجريبي وينشئ جدوله في SQLite الذاكرية فقط، ويدرج سجلين ويقرأهما بترتيب حتمي. يجهز schema_editor العينة لا يستبدل ترحيلات التطبيق. لا يستورد إعداد مشروع أو قاعدة عمل. يثبت الناتج سلوك ORM المحلي لا قفل وتخطيط محرك الإنتاج وصلاحياته، فاحفظ الفرق عند الاستدلال. ولا يمكن نقل نتائج هذه القاعدة الصغيرة إلى افتراضات عن قفل محرك آخر أو ترتيب نصوصه أو صلاحيات النشر؛ فكل منها يحتاج دليله المناسب.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
from django.db import connection, models
class Course(models.Model):
title = models.CharField(max_length=100)
seats = models.PositiveIntegerField(default=0)
class Meta:
app_label = "lab"
with connection.schema_editor() as editor:
editor.create_model(Course)
Course.objects.create(title="Django", seats=4)
Course.objects.create(title="Python", seats=2)
print(list(Course.objects.order_by("title").values_list("title", flat=True)))
['Django', 'Python']
القاعدة الوحيدة SQLite الذاكرية والتهيئة المباشرة للعينة لا لإنتاج.
الترحيلات عقد مخطط بإصدارات
يضيف المقطع seats لمخطط أقدم لا يحويها ويحدد السابق بالاعتماد، ولا يطبق هنا. راجع المولد للبيانات والافتراض والعكس وكلفة المحرك. قد ينشئ تعديل المنشور تواريخ متناقضة. لا يغير ملف النموذج جدولا قائما، فخطط توافق النشر خصوصا مع نسختين تعملان معا. ويجب أن تراعي خطة النشر فترة تعايش الشفرة القديمة والجديدة، حتى لا يطلب أحدهما عمودا غير موجود أو يكتب بيانات لا يفهمها الآخر.
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("catalog", "0001_initial")]
operations = [
migrations.AddField(
model_name="course", name="seats",
field=models.PositiveIntegerField(default=0),
),
]
If reviewed and applied in the declared app: a seats field is added with the stated default.
يفترض المقطع غياب seats سابقا والصفر افتراض تعليمي يحتاج مراجعة بيانات حقيقية، ولا يطبق.
مراجعة انتقال المخطط والبيانات معا
ميز عملية مخطط قابلة للعكس من تحويل بيانات لا يعكس. احفظ معنى الملء وقد تحتاج الجداول الكبيرة مراحل وقياسا. استخدم نماذج سجل الترحيل التاريخية لا استيراد الحالية بافتراض تطابق الماضي. راجع النسخ وحدود التراجع قبل الإتلاف. لا ينفذ المقرر ترحيل مشروع أو قاعدة معدة ولا يدعي اختبار نشر. وعند ترحيل البيانات من حالة قديمة، يضمن استخدام سجل النماذج التاريخية توافق العملية مع المخطط الذي كانت عليه القاعدة في ذلك الموضع من التاريخ.
الأخطاء الشائعة وإصلاحها
لا يغير تعديل النموذج الجدول
- لماذا يحدث؟
- اختلط الكود بالتاريخ المطبق.
- كيف تصلحه؟
- راجع الترحيل ونفذه ببيئة مناسبة.
- كيف تتجنب تكراره؟
- تتبع التاريخ مع النموذج.
تقبل save ما توقع رفضه
- لماذا يحدث؟
- افترض التحقق التلقائي.
- كيف تصلحه؟
- تحقق بالحد واحفظ القيود.
- كيف تتجنب تكراره؟
- اختبر الكتابات البديلة والجماعية.
ينكسر ترحيل بيانات بعد تغييرات
- لماذا يحدث؟
- استورد الحالية لا التاريخية.
- كيف تصلحه؟
- استخدم نموذج السجل التاريخي.
- كيف تتجنب تكراره؟
- راجع إعادة التشغيل من الماضي.
اختبر فهمك
1. لماذا لا يكفي تحقق فردية النموذج أمام إدراجين؟
اعرض الحل المشروح
قد ينجح الاثنان قبل الالتزام. يحسم قيد القاعدة الكتابة وتعالج العملية رفضه. يفيد التحقق مبكرا ولا يحجز القيمة أو يستبدل التصميم.
2. خطط إضافة حقل مطلوب لجدول كبير مأهول.
اعرض الحل المشروح
حدد قيمة صادقة ومرحلة متوافقة ثم املأ بعملية محدودة مراجعة وافرض المطلوب بعد توافق البيانات والتطبيق. قيّم الكلفة والتراجع لا أمرا عالميا.
أهم ما تعلمته
- التعريف والمخطط المطبق حالتان.
- لا تستدعي save التحقق الكامل تلقائيا.
- تحتاج الترحيلات مراجعة تاريخ وتشغيل.