إدارة وتعديل البيانات بكفاءة باستخدام هجرات Django
مقدمة: التعامل مع تعقيدات نمو التطبيقات
في عالم تطوير الويب سريع التطور، تُعد التطبيقات الناجحة التي تشهد نموًا مستمرًا بمثابة تحدٍ جميل. فمع تطور المنتج، تتراكم التعقيدات بشكل طبيعي، تمامًا كما تتراكم طبقات التزيين على كعكة نهاية الأسبوع. لحسن الحظ، يوفر إطار عمل Django، الذي أُفضله كونه يأتي بـ “بطاريات مدمجة”، حلولًا ممتازة للتعامل مع هذه التعقيدات.
تساعد نماذج Django المطورين على التعامل مع البيانات بطريقة منطقية وسهلة الفهم. كما يقدم الإطار العديد من الفئات التي يمكن وراثتها لتطوير تطبيقات قوية بسرعة من الصفر. وعندما يتعلق الأمر بالتطوير على تطبيقات Django الموجودة، توجد ميزة مخصصة لذلك أيضًا. في هذا المقال، سنتعمق في كيفية استخدام هجرات Django لتحديث نماذجك وقاعدة بياناتك الحالية.
فهم آليات هجرات Django
هجرات Django هي ملفات Python تساعدك على إضافة وتغيير العناصر في جداول قاعدة بياناتك لتعكس التعديلات التي تجريها على نماذج Django الخاصة بك. لفهم كيفية مساعدة هجرات Django في التعامل مع البيانات، قد يكون من المفيد استيعاب الهياكل الأساسية التي نعمل عليها.
ما هو جدول قاعدة البيانات؟
إذا سبق لك أن رأيت جدول بيانات (spreadsheet)، فأنت بالفعل على دراية كبيرة بفهم جدول قاعدة البيانات. في قاعدة البيانات العلائقية، مثل قاعدة بيانات PostgreSQL، تتوقع أن ترى البيانات منظمة في أعمدة وصفوف. قد يحتوي جدول قاعدة البيانات العلائقية على عدد ثابت من الأعمدة وأي عدد من الصفوف.
في Django، يمثل كل نموذج (model) جدولًا خاصًا به. على سبيل المثال، إليك نموذج Django بسيط:
from django.db import models
class Lunch(models.Model):
left_side = models.CharField(max_length=100, null=True)
center = models.CharField(max_length=100, null=True)
right_side = models.CharField(max_length=100, null=True)
يمثل كل حقل (field) في هذا النموذج عمودًا في جدول قاعدة البيانات، ويمثل كل صف (row) نسخة كائن Django من هذا النموذج. إليك تمثيل لجدول قاعدة بيانات لنموذج Django المسمى Lunch أعلاه. في قاعدة البيانات، سيكون اسمه غالبًا lunch_table:
id | left_side | center | right_side
---|-----------|--------|-----------
1 | Fork | Plate | Spoon
يحتوي نموذج Lunch على ثلاثة حقول: left_side، center، و right_side. ستحتوي نسخة واحدة من كائن Lunch على القيمة “Fork” للحقل left_side، و “Plate” للحقل center، و “Spoon” للحقل right_side. يضيف Django تلقائيًا حقل id إذا لم تحدد مفتاحًا أساسيًا (primary key).
تغيير اسم النموذج وتأثيره على الهجرات
إذا أردت تغيير اسم نموذج Lunch الخاص بك، يمكنك القيام بذلك في ملف models.py الخاص بك. على سبيل المثال، قم بتغيير “Lunch” إلى “Dinner”، ثم قم بتشغيل الأمر python manage.py makemigrations. سترى مخرجات مشابهة لما يلي:
python manage.py makemigrations
Did you rename the backend.Lunch model to Dinner? [y/N] y
Migrations for 'backend':
backend/migrations/0003_auto_20200922_2331.py
- Rename model Lunch to Dinner
يقوم Django تلقائيًا بإنشاء ملفات الهجرة المناسبة. سيبدو السطر ذو الصلة في ملف الهجرات المُنشأ في هذه الحالة كما يلي:
migrations.RenameModel(old_name="Lunch", new_name="Dinner"),
ستقوم هذه العملية بإعادة تسمية نموذج Lunch الخاص بنا إلى Dinner مع الإبقاء على كل شيء آخر كما هو. ولكن ماذا لو أردت أيضًا تغيير هيكل جدول قاعدة البيانات نفسه، أي مخطط (schema) الجدول، والتأكد من أن البيانات الموجودة تنتهي في المكان الصحيح في جدول Dinner الجديد الخاص بك؟

دعنا نستكشف كيفية تحويل نموذج Lunch الخاص بنا إلى نموذج Dinner يبدو كما يلي:
from django.db import models
class Dinner(models.Model):
top_left = models.CharField(max_length=100, null=True)
top_center = models.CharField(max_length=100, null=True)
top_right = models.CharField(max_length=100, null=True)
bottom_left = models.CharField(max_length=100, null=True)
bottom_center = models.CharField(max_length=100, null=True)
bottom_right = models.CharField(max_length=100, null=True)
مع جدول قاعدة بيانات سيبدو هكذا:
id | top_left | top_center | top_right | bottom_left | bottom_center | bottom_right
---|----------|------------|-----------|-------------|---------------|-------------
1 | Bread | Spoon | Glass | Fork | Plate | Knife
كيفية التعامل مع البيانات باستخدام هجرات Django
قبل البدء في التعامل مع بياناتك، من الجيد دائمًا إنشاء نسخة احتياطية من قاعدة بياناتك يمكنك استعادتها في حالة حدوث أي خطأ. توجد طرق مختلفة للقيام بذلك اعتمادًا على قاعدة البيانات التي تستخدمها. يمكنك عادةً العثور على التعليمات بالبحث عن <your database name> وكلمات مفتاحية مثل backup أو recovery أو snapshot.
لتصميم هجرتك، من المفيد أن تكون على دراية بـ عمليات الهجرة المتاحة. يتم تنفيذ الهجرات خطوة بخطوة، وكل عملية هي نوع من إضافة أو إزالة أو تعديل البيانات. مثل اللغز الاستراتيجي، من المهم إجراء تغييرات النموذج خطوة بخطوة لضمان أن الهجرات المُنشأة تؤدي إلى النتيجة الصحيحة.
إعادة تسمية الحقول الموجودة
لقد قمنا بالفعل بإعادة تسمية نموذجنا بنجاح. الآن، سنعيد تسمية الحقول التي تحتوي على البيانات التي نريد الاحتفاظ بها. لنفترض أننا نريد تحويل الحقول القديمة left_side و center و right_side إلى bottom_left و bottom_center و top_center على التوالي. سنقوم بتعديل نموذج Dinner مؤقتًا ليبدو هكذا:
class Dinner(models.Model):
bottom_left = models.CharField(max_length=100, null=True)
bottom_center = models.CharField(max_length=100, null=True)
top_center = models.CharField(max_length=100, null=True)
يكون Django ذكيًا أحيانًا بما يكفي لتحديد أسماء الحقول القديمة والجديدة بشكل صحيح. سيُطلب منك تأكيد ذلك عند تشغيل python manage.py makemigrations:
python manage.py makemigrations
Did you rename dinner.center to dinner.bottom_center (a CharField)? [y/N] y
Did you rename dinner.left_side to dinner.bottom_left (a CharField)? [y/N] y
Did you rename dinner.right_side to dinner.top_center (a CharField)? [y/N] y
Migrations for 'backend':
backend/migrations/0004_auto_20200914_2345.py
- Rename field center on dinner to bottom_center
- Rename field left_side on dinner to bottom_left
- Rename field right_side on dinner to top_center
في بعض الحالات، قد ترغب في محاولة إعادة تسمية الحقل وتشغيل makemigrations واحدًا تلو الآخر لضمان الدقة.
إضافة حقول جديدة للنموذج
الآن بعد أن تم ترحيل الحقول الموجودة إلى أسمائها الجديدة، أضف الحقول المتبقية إلى النموذج Dinner ليعكس الهيكل النهائي الذي نرغب به:
class Dinner(models.Model):
top_left = models.CharField(max_length=100, null=True)
top_center = models.CharField(max_length=100, null=True)
top_right = models.CharField(max_length=100, null=True)
bottom_left = models.CharField(max_length=100, null=True)
bottom_center = models.CharField(max_length=100, null=True)
bottom_right = models.CharField(max_length=100, null=True)
تشغيل makemigrations مرة أخرى الآن يعطينا:
python manage.py makemigrations
Migrations for 'backend':
backend/migrations/0005_auto_20200914_2351.py
- Add field bottom_right to dinner
- Add field top_left to dinner
- Add field top_right to dinner
لقد انتهيت! من خلال إنشاء هجرات Django، قمت بنجاح بإعداد جدول dinner_table الخاص بك ونقل البيانات الموجودة إلى مكانها الجديد.
التعامل مع التعقيدات الإضافية
ستلاحظ أن نماذج Lunch و Dinner لدينا ليست معقدة للغاية. من بين العديد من خيارات حقول نماذج Django، استخدمنا فقط CharField. لقد قمنا أيضًا بتعيين null=True للسماح لـ Django بتخزين القيم الفارغة كـ NULL في قاعدة البيانات.
يمكن لهجرات Django التعامل مع تعقيدات إضافية، مثل تغيير أنواع الحقول، وما إذا كانت القيمة الفارغة أو الخالية مسموح بها. أحتفظ دائمًا بـ مرجع حقول نماذج Django في متناول يدي أثناء عملي مع أنواع مختلفة من البيانات وحالات الاستخدام المتنوعة.
هجرات Django: تبسيط الغموض
آمل أن يكون هذا المقال قد ساعدك على فهم هجرات Django وكيفية عملها بشكل أفضل! الآن بعد أن أصبحت قادرًا على تغيير النماذج والتلاعب بالبيانات الموجودة في تطبيق Django الخاص بك، تأكد من استخدام صلاحياتك بحكمة. قم بعمل نسخة احتياطية من قاعدة بياناتك، وابحث وخطط لهجراتك بعناية، وقم دائمًا بتشغيل الاختبارات قبل العمل مع بيانات العملاء. من خلال القيام بذلك، لديك القدرة على تمكين تطبيقك من النمو – بمستويات تعقيد يمكن إدارتها.
الخلاصة التقنية
تُعد هجرات Django أداة لا غنى عنها لأي مطور يتعامل مع تطبيقات Django ديناميكية. إنها لا تسمح فقط بتعديل مخطط قاعدة البيانات (schema) بسلاسة ليتوافق مع التغييرات في النماذج، بل توفر أيضًا آلية قوية لمعالجة البيانات الموجودة أثناء هذه التغييرات. المفتاح لنجاح الهجرات يكمن في التخطيط الدقيق، والفهم العميق لعمليات الهجرة المتاحة، والأهم من ذلك، الالتزام الصارم بإجراء نسخ احتياطية منتظمة واختبارات شاملة. هذا النهج يضمن سلامة البيانات ويقلل من مخاطر الأعطال، مما يمكن التطبيقات من التطور والنمو بكفاءة وثقة.