البرمجة

نماذج جانغو وربطها بقاعدة البيانات

جدول المحتوى

إنشاء نماذج جانغو Django Models وربطها بقاعدة البيانات: دليل شامل وموسع

تُعد نماذج جانغو (Django Models) من الركائز الأساسية في تطوير تطبيقات الويب باستخدام إطار العمل جانغو، حيث تمثل الهيكل التنظيمي للبيانات التي يتم تخزينها في قاعدة البيانات، وتُسهّل عملية التفاعل معها عبر واجهة برمجية عالية المستوى. في هذا المقال الموسع، سنقدم شرحاً مفصلاً حول كيفية إنشاء نماذج جانغو وربطها بقاعدة البيانات، مع استعراض شامل للمفاهيم الأساسية والتقنيات المتقدمة التي تساعد المطورين على بناء تطبيقات قوية وقابلة للتوسع.


1. مقدمة عن جانغو ونماذج البيانات

جانغو هو إطار عمل ويب مفتوح المصدر قائم على لغة البرمجة بايثون، صُمم لتسهيل بناء تطبيقات الويب بسرعة وأمان. من أهم مميزاته هو نظام نماذج البيانات، والذي يسمح بإنشاء وتعديل قواعد البيانات باستخدام كائنات بايثونية (Python classes) بدلاً من التعامل المباشر مع SQL. هذا النظام يعرف باسم ORM (Object-Relational Mapping) أو “التخطيط العلاقي للكائنات”.

ORM وأهميته في جانغو

ORM هو جسر يربط بين البرمجة الكائنية (Object-Oriented Programming) وقواعد البيانات العلائقية، مما يسمح للمطور بالتعامل مع البيانات في شكل كائنات بدلاً من استعلامات SQL معقدة. جانغو يوفر ORM متكامل وسهل الاستخدام يمكن من خلاله إنشاء نماذج بيانات تمثل الجداول داخل قاعدة البيانات، مع توفير العديد من الوظائف لإدارة العلاقات، والبحث، والتحديث، والحذف.


2. إنشاء نموذج في جانغو: البنية الأساسية

لبداية استخدام نماذج جانغو، يتم إنشاء ملف باسم models.py داخل تطبيق جانغو. النموذج في جانغو يُعرَّف باستخدام كلاس يرث من django.db.models.Model. كل خاصية (أو حقل) في النموذج تمثل عمودًا في جدول قاعدة البيانات.

مثال على نموذج بسيط

python
from django.db import models class Book(models.Model): title = models.CharField(max_length=200) author = models.CharField(max_length=100) published_date = models.DateField() isbn = models.CharField(max_length=13, unique=True) pages = models.IntegerField() cover = models.ImageField(upload_to='covers/', null=True, blank=True)

في هذا المثال، نموذج Book يحتوي على عدة حقول متنوعة تمثل معلومات الكتاب:

  • CharField لحقل نصي مع تحديد الحد الأقصى للطول.

  • DateField لتاريخ النشر.

  • IntegerField لعدد الصفحات.

  • ImageField لتخزين صورة الغلاف مع تحديد مجلد التخزين.


3. أنواع الحقول الأساسية في نماذج جانغو

جانغو يقدم مجموعة واسعة من الحقول التي يمكن استخدامها لبناء النموذج المناسب للبيانات المطلوبة، وهذه بعض الحقول الأكثر شيوعًا:

نوع الحقل الوصف الاستخدام الشائع
CharField نص قصير مع حد أقصى للطول الأسماء، العناوين، النصوص القصيرة
TextField نص طويل بدون حد أقصى عملي الوصف، المحتوى الكبير
IntegerField أعداد صحيحة الأعمار، الكميات
FloatField أعداد عشرية الأسعار، القيم العددية
BooleanField قيمة منطقية (صح/خطأ) الحالات الثنائية، التفعيل
DateField تاريخ (يوم/شهر/سنة) تواريخ الميلاد، تواريخ الحدث
DateTimeField تاريخ مع وقت الطوابع الزمنية، سجلات الدخول
EmailField بريد إلكتروني عناوين البريد الإلكتروني
URLField رابط إنترنت روابط المواقع
ForeignKey علاقة “واحد إلى متعدد” مع نموذج آخر الربط بين الجداول المختلفة
ManyToManyField علاقة “متعدد إلى متعدد” بين نماذج التصنيفات، الوسوم

4. الربط بين النماذج (علاقات قواعد البيانات)

من أهم مزايا ORM في جانغو هو دعم إنشاء العلاقات بين النماذج بطرق سهلة وفعالة. هناك ثلاثة أنواع رئيسية من العلاقات:

أ. علاقة واحد إلى متعدد (One-to-Many)

يتم تنفيذها باستخدام ForeignKey، حيث يمكن لنموذج واحد أن يرتبط بعدة سجلات في نموذج آخر.

مثال:

python
class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE)

في المثال أعلاه، كل كتاب مرتبط بمؤلف واحد، لكن المؤلف يمكن أن يكون مرتبطًا بعدة كتب.

ب. علاقة واحد إلى واحد (One-to-One)

يتم استخدام OneToOneField لربط نموذج بسجل واحد فقط من نموذج آخر.

مثال:

python
class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) bio = models.TextField()

ج. علاقة متعدد إلى متعدد (Many-to-Many)

تُستخدم ManyToManyField لإنشاء علاقات بين نماذج حيث يمكن لكل سجل في النموذج الأول أن يرتبط بعدة سجلات في النموذج الثاني والعكس صحيح.

مثال:

python
class Student(models.Model): name = models.CharField(max_length=100) class Course(models.Model): title = models.CharField(max_length=200) students = models.ManyToManyField(Student)

5. إعداد قاعدة البيانات وربطها بجانغو

جانغو يدعم العديد من قواعد البيانات مثل SQLite (مضمّن بشكل افتراضي)، PostgreSQL، MySQL، وOracle. يتم إعداد الاتصال بقاعدة البيانات من خلال ملف settings.py في مشروع جانغو.

مثال إعداد قاعدة بيانات PostgreSQL

python
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'myuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '5432', } }

بعد تكوين قاعدة البيانات في settings.py، يتم تنفيذ الأوامر التالية لإنشاء الجداول بناءً على النماذج:

bash
python manage.py makemigrations python manage.py migrate
  • الأمر makemigrations يقوم بإنشاء ملفات الترحيل التي تحتوي على تغييرات النماذج.

  • الأمر migrate ينفذ هذه التغييرات على قاعدة البيانات من خلال إنشاء الجداول أو تعديلها.


6. الحقول المتقدمة وخيارات الحقول في نماذج جانغو

تدعم الحقول في جانغو العديد من الخيارات التي تتحكم في سلوك الحقل داخل قاعدة البيانات وفي واجهة الإدارة، منها:

  • null=True يسمح بتخزين القيمة كـ NULL في قاعدة البيانات.

  • blank=True يسمح بترك الحقل فارغًا في نماذج الإدخال.

  • default لتحديد قيمة افتراضية.

  • unique=True لضمان أن تكون قيمة الحقل فريدة عبر جميع السجلات.

  • choices لتحديد مجموعة من القيم الممكنة للحقل.

مثال باستخدام خيارات متقدمة

python
class Product(models.Model): STATUS_CHOICES = [ ('A', 'Active'), ('I', 'Inactive'), ('D', 'Discontinued'), ] name = models.CharField(max_length=100) status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='A') price = models.DecimalField(max_digits=10, decimal_places=2) description = models.TextField(blank=True, null=True)

7. العمل مع نماذج جانغو: إنشاء، تعديل، حذف البيانات

بعد إنشاء النموذج وربطه بقاعدة البيانات، يمكن إدارة البيانات عبر واجهة الإدارة أو من خلال الأكواد البرمجية.

إنشاء سجل جديد

python
from myapp.models import Book book = Book( title="Django for Professionals", author="William S. Vincent", published_date="2020-05-01", isbn="1234567890123", pages=250 ) book.save()

تعديل سجل موجود

python
book = Book.objects.get(id=1) book.pages = 300 book.save()

حذف سجل

python
book = Book.objects.get(id=1) book.delete()

8. الاستعلامات في جانغو ORM

تعتبر الاستعلامات من أهم العمليات التي يتم تنفيذها على قواعد البيانات، وجانغو يوفر واجهة استعلامات قوية تُمكّن من تنفيذ عمليات معقدة بسهولة.

بعض العمليات الأساسية

العملية الوصف المثال
all() جلب جميع السجلات Book.objects.all()
filter() ترشيح السجلات بناءً على شروط Book.objects.filter(author="John")
exclude() استبعاد سجلات معينة Book.objects.exclude(pages__lt=100)
get() جلب سجل واحد مطابق للشروط Book.objects.get(id=1)
order_by() ترتيب النتائج Book.objects.order_by('published_date')
values() جلب الحقول المطلوبة فقط Book.objects.values('title', 'author')
annotate() إضافة حقول محسوبة استخدام مع aggregate و Count, Sum

9. النماذج في واجهة الإدارة (Admin Interface)

جانغو يقدم لوحة إدارة جاهزة وقوية يمكن ربط النماذج بها لتمكين إدارة المحتوى بسهولة من خلال واجهة رسومية.

تفعيل النماذج في لوحة الإدارة

في ملف admin.py الخاص بالتطبيق، يمكن تسجيل النماذج:

python
from django.contrib import admin from .models import Book admin.site.register(Book)

يمكن أيضًا تخصيص طريقة عرض النماذج في لوحة الإدارة باستخدام فئات ModelAdmin:

python
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'published_date') search_fields = ('title', 'author') admin.site.register(Book, BookAdmin)

10. التعامل مع الهجرات (Migrations) بشكل متقدم

الهجرات هي طريقة جانغو لإدارة تغييرات بنية قاعدة البيانات بطريقة منظمة وآمنة، وتُستخدم في تحديث الجداول دون فقد البيانات.

إدارة الهجرات

  • makemigrations: إنشاء ملفات الهجرات بناءً على التغييرات في النماذج.

  • migrate: تطبيق التغييرات على قاعدة البيانات.

  • showmigrations: عرض قائمة بالهجرات المنفذة والمتبقية.

  • sqlmigrate: عرض الاستعلامات SQL التي سيتم تنفيذها لهجرة معينة.

التراجع عن الهجرات

يمكن التراجع عن هجرة معينة باستخدام الأمر:

bash
python manage.py migrate app_name migration_name

11. تحسين الأداء في نماذج جانغو

عند التعامل مع قواعد بيانات كبيرة أو نماذج معقدة، يصبح الأداء عاملاً حاسماً. بعض النصائح لتحسين الأداء:

  • استخدام الفهارس (Indexes): يمكن إضافة db_index=True على الحقول التي تُستخدم كثيرًا في عمليات البحث.

  • تجنب الاستعلامات الزائدة: استخدام select_related وprefetch_related لتحميل العلاقات بفعالية.

  • التخزين المؤقت (Caching): تخزين نتائج الاستعلامات المتكررة لتقليل الحمل على قاعدة البيانات.

  • تقسيم الجداول: في حالات البيانات الكبيرة، يمكن التفكير في تقسيم البيانات أو استخدام قواعد بيانات متخصصة.


12. مزايا استخدام نماذج جانغو في تطوير التطبيقات

  • تبسيط التعامل مع قواعد البيانات: عدم الحاجة لكتابة استعلامات SQL معقدة.

  • التكامل الكامل مع باقي أجزاء جانغو: مثل الواجهات الإدارية، الاستمارات، وأنظمة المصادقة.

  • دعم الترحيلات (Migrations): لتحديث قاعدة البيانات بشكل آمن ومنظم.

  • مرونة في إنشاء العلاقات: دعم أنواع متعددة من العلاقات بين النماذج.

  • قابلية التوسع: إمكانية تعديل النموذج بسهولة مع نمو التطبيق.


13. خاتمة تقنية

إن نماذج جانغو تمثل العمود الفقري لأي تطبيق ويب متكامل يعتمد على قاعدة بيانات، فهي توفر بنية قوية وسهلة لإدارة البيانات دون الحاجة إلى معرفة عميقة بـ SQL، مما يسرع عملية التطوير ويوفر أمانًا وكفاءة في التعامل مع البيانات. من خلال إتقان إنشاء النماذج وربطها بشكل صحيح بقاعدة البيانات، يمكن للمطورين بناء تطبيقات مرنة وقابلة للتوسع، كما تتيح لهم القدرة على إدارة البيانات بكفاءة عالية، مما ينعكس إيجابًا على جودة وأداء التطبيقات بشكل عام.


المصادر والمراجع


بهذا يصبح لديك فهم عميق ومفصل حول إنشاء نماذج جانغو وربطها بقاعدة البيانات، مع استيعاب لجميع الخطوات والمفاهيم التي تساعد في بناء تطبيقات ويب قوية وعالية الجودة.