نماذج جانغو Django Models

تعد نماذج Django جزءًا أساسيًا من كل تطبيق جانغو. حيث تحدد بنية وسلوك البيانات المخزنة في Django.

يتم تعريف النماذج في جانغو باستخدام فئات بايثون التي تنتمي إلى الفئة الفرعية django.db.models.Model. و تحدد كل فئة نموذج مجموعة من الحقول التي تمثل البيانات المخزنة في النموذج.

على سبيل المثال، إليك نموذج بسيط يحدد نموذج الشخص بحقل الاسم وحقل العمر:

from django.db import models
class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

بمجرد تحديد النماذج الخاصة بك، سيقوم Django تلقائيًا بإنشاء مخطط قاعدة بيانات لك استنادًا إلى الحقول التي حددتها. يمكنك بعد ذلك استخدام Django ORM (مخطط الكائنات العلائقية) للاستعلام عن البيانات المخزنة في نماذجك ومعالجتها.

تعريف النموذج

لتعريف نموذج في Django، ستحتاج إلى إنشاء فئة بايثون التي تصنف فئات فرعية django.db.models.Model حيث تحتوي على مجموعة من الحقول.

فيما يلي مثال لتعريف نموذج بسيط:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

في هذا المثال، قمنا بتعريف نموذج Person بحتوي على حقلين name و age. بحيث يكون حقل name عبارة عن CharField، وهو حقل يخزن بيانات الأحرف، وحقل age عبارة عن IntegerField، وهو حقل يخزن بيانات الأعداد الصحيحة.

بمجرد تعريف النموذج ستحتاج إلى تشغيل الأمر migrate لإنشاء جداول قاعدة البيانات:

python manage.py migrate

سيؤدي هذا إلى إنشاء جدول جديد في قاعدة البيانات لنموذج Person، مع أعمدة لحقول name و age.

يمكنك بعد ذلك استخدام Django ORM للاستعلام عن البيانات المخزنة في النموذج الخاص بك ومعالجتها. على سبيل المثال، يمكنك استخدام سمة Person.objects للوصول إلى مدير النموذج وإنشاء مثيلات النموذج واستردادها وتحديثها وحذفها:

# Create a new Person instance
person = Person(name='John', age=30)
person.save()

# Retrieve a Person instance
person = Person.objects.get(name='John')

# Update a Person instance
person.age = 31
person.save()

# Delete a Person instance
person.delete()

أنواع الحقول

يمكنك استخدام أنواع مختلفة من الحقول لتخزين أنواع مختلفة من البيانات في نماذجك. فيما يلي قائمة بأنواع الحقول الأكثر استخدامًا في Django:

  • CharField: حقل يقوم بتخزين بيانات حر. كما يمكنك تحديد الحد الأقصى لطول الحقل باستخدام max_length.
  • TextField: حقل يقوم بتخزين البيانات النصية الطويلة.
  • IntegerField: حقل يقوم بتخزين البيانات الصحيحة.
  • BooleanField: حقل يقوم بتخزين البيانات المنطقية (True أو False).
  • DateField: حقل يقوم بتخزين التاريخ (بدون وقت).
  • TimeField: حقل يقوم بتخزين الوقت (بدون تاريخ).
  • DateTimeField: حقل يقوم بتخزين التاريخ والوقت.
  • DecimalField: حقل يقوم بتخزين البيانات العشرية.
  • EmailField: حقل يقوم بتخزين عنوان البريد الإلكتروني.
  • URLField: حقل يقوم بتخزين عنوان URL.
  • FileField: حقل يقوم بتخزين ملف.
  • ImageField: حقل يقوم بتخزين ملف صورة.

يمكنك تحديد خيارات إضافية لكل نوع من الحقول، مثل فارغ وافتراضي. كما يمكنك أيضًا استخدام أدوات التحقق من صحة الحقل للتأكد من صحة البيانات المخزنة في الحقل.

خيارات النموذج

في Django، يمكنك تحديد خيارات متنوعة لنماذجك باستخدام فئة Meta. تسمح لك فئة Meta بتعيين خيارات مثل اسم جدول قاعدة بيانات النموذج وترتيبه وما إذا كان يجب أن يكون مجردًا أو ذو تصميم فردي.

فيما يلي مثال لكيفية استخدام فئة Meta لتعيين خيارات النموذج:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

    class Meta:
        # تعيين اسم جدول قاعدة البيانات
        db_table = 'my_person_table'
        # ضبط ترتيب النموذج
        ordering = ['age']
        # جعل النموذج مجرد
        abstract = True

في هذا المثال، قمنا بتعيين اسم جدول قاعدة البيانات إلى my_person_table، ويستند الترتيب إلى حقل age، وقمنا بإنشاء ملخص النموذج.

يتيح لك خيار db_table تحديد اسم مخصص لجدول قاعدة البيانات الذي سيتم استخدامه لتخزين بيانات النموذج. افتراضيًا، سيستخدم Django اسم جدول افتراضيًا يعتمد على اسم النموذج.

يتيح لك خيار الطلب تحديد الترتيب الافتراضي لكائنات النموذج. بشكل افتراضي، الترتيب تصاعدي. يمكنك استخدام صيغة “-field_name” لتحديد الترتيب التنازلي.

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

إدارة النموذج

مدير النموذج هو واجهة يمكنك من خلالها التفاعل مع البيانات المخزنة في النموذج. افتراضيًا، يوفر Django مديرًا للنماذج يسمى كائنات لكل نموذج. يوفر مدير الكائنات طرقًا لإنشاء كائنات النموذج واسترجاعها وتحديثها وحذفها.

فيما يلي مثال لكيفية استخدام مدير الكائنات للاستعلام عن البيانات ومعالجتها في النموذج:

from myapp.models import Person

# Create a new Person object
person = Person(name='John', age=30)
person.save()

# Retrieve all Person objects
people = Person.objects.all()

# Retrieve a single Person object
person = Person.objects.get(name='John')

# Update a Person object
person.age = 31
person.save()

# Delete a Person object
person.delete()

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

لتحديد مدير نموذج مخصص، ستحتاج إلى إنشاء فئة فرعية من django.db.models.Manager وتعيينها كسمة الكائنات لنموذجك. يمكنك بعد ذلك تحديد أساليب مخصصة في فئة المدير لتوفير وظائف إضافية.

فيما يلي مثال لكيفية تحديد مدير نموذج مخصص:

from django.db import models

class PersonManager(models.Manager):
    def get_adults(self):
        return self.filter(age__gte=18)

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

    objects = PersonManager()

في هذا المثال، قمنا بتعريف مدير نموذج مخصص يسمى PersonManager الذي يوفر تابع get_adults لاسترداد كافة كائنات الأشخاص الذين يبلغ عمرهم 18 عامًا أو أكثر. قمنا بعد ذلك بتعيين PersonManager كمدير افتراضي لنموذج الشخص باستخدام سمة الكائنات.

يمكنك بعد ذلك استخدام التابع get_adults كأي أسلوب استعلام آخر:

adults = Person.objects.get_adults()

ألية الوراثة في النماذج

يمكنك استخدام ألية الوراثة بين النماذج و يتيح لك هذا تحديد الحقول والسلوكيات الشائعة في النموذج الأساسي، ثم إنشاء نماذج مشتقة ترث من النموذج الأساسي وإضافة حقول وسلوكيات إضافية.

هناك ثلاثة أنواع من وراثة النماذج في جانغو: الفئات الأساسية المجردة، والميراث متعدد الجداول، ونماذج الوكيل.

الفئات الأساسية المجردة

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

لتحديد فئة أساسية مجردة، ستحتاج إلى تعيين السمة المجردة لفئة Meta على True.

فيما يلي مثال لكيفية تحديد فئة أساسية مجردة:

from django.db import models

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Person(BaseModel):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

في هذا المثال، BaseModel هو فئة أساسية مجردة يجتوي على حقلين create_at و update_at. كما يرث نموذج Person من BaseModel بالإضافة إلى حقل name و age.

وراثة الجداول المتعددة:

يتم استخدام الميراث متعدد الجداول لتحديد نموذج أساسي ونموذج مشتق واحد أو أكثر لكل منها جدول قاعدة البيانات الخاص به. يتيح ذلك للنماذج المشتقة أن تحتوي على حقول وسلوكيات إضافية خاصة بها.

لاستخدام وراثة الجداول المتعددة، ستحتاج إلى تحديد BaseModel كفئة أصل باستخدام بناء جملة models.Model.

فيما يلي مثال لكيفية استخدام وراثة الجداول المتعددة:

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Person(BaseModel):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

class Student(Person):
    student_id = models.CharField(max_length=100)
    major = models.CharField(max_length=100)

في هذا المثال، نموذج Person هو النموذج الأساسي ونموذج Student هو النموذج المشتق. حيث يرث نموذج Student من نموذج Person بالإضافة إلى حقلي student_id و major.

نماذج الوكيل:

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

لتعريف نموذج وكيل، ستحتاج إلى تحديد النموذج الأصلي كفئة أصل باستخدام models.Model، وتعيين سمة الوكيل لفئة Meta على True.

فيما يلي مثال لكيفية تحديد نموذج الوكيل:

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

class Employee(Person):
    employee_id = models.CharField(max_length=100)
    salary = models.DecimalField(max_digits=10, decimal_places=2)

    class Meta:
        proxy = True

في هذا المثال، نموذج Person هو النموذج الأصلي ونموذج Employee هو نموذج الوكيل. يرث نموذج Employee من نموذج Person بالإضافة إلى حقلي employee_id و salary. كما تم تعيين سمة الوكيل على True، مما يشير إلى أن نموذج Employee هو نموذج وكيل.

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


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading