علاقات النماذج في Django

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

هناك ثلاثة أنواع من علاقات النماذج في جانغو: one-to-one relationships، many-to-one relationships، و many-to-many relationships.

One-To-One Relationships

تُستخدم علاقات one-to-one لإنشاء علاقة بين نموذجين حيث يرتبط كل نموذج بمثيل واحد من النموذج الآخر. غالبًا ما يتم استخدام علاقات one-to-one عندما تريد تخزين معلومات إضافية حول نموذج لا يتناسب مع النموذج الرئيسي.

في Django، يمكنك استخدام OneToOneField لتحديد علاقة one-to-one بين نموذجين.

OneToOneField هو حقل يُستخدم لإنشاء علاقة مفتاح خارجي مع نموذج آخر.

فيما يلي مثال لكيفية تعريف علاقة one-to-one باستخدام OneToOneField:

from django.db import models

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

class Passport(models.Model):
    person = models.OneToOneField(Person, on_delete=models.CASCADE)
    passport_number = models.CharField(max_length=100)

في هذا المثال، لدى نموذج Person علاقة one-to-one مع نموذج Passport. يحتوي نموذج Passport على OneToOneField يسمى person الذي يتم استخدامه لإنشاء علاقة مفتاح خارجي مع نموذج Person.

يمكنك استخدام OneToOneField لإنشاء علاقة one-to-one في أي من الاتجاهين. على سبيل المثال، يمكنك أيضًا تحديد علاقة one-to-one في نموذج Person مثل:

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    passport = models.OneToOneField(Passport, on_delete=models.CASCADE, related_name='person')

في هذا المثال، لدى نموذج Person علاقة one-to-one مع نموذج Passport. حيث يحتوي نموذج Person على OneToOneField يسمى passport والذي يتم استخدامه لإنشاء علاقة مفتاح خارجي مع نموذج Passport. يتم استخدام السمة ذات الصلة لتحديد اسم العلاقة العكسية من نموذج Passport إلى نموذج Person.

كما يمكنك استخدام OneToOneField لإنشاء علاقة one-to-one في أي من الاتجاهين. على سبيل المثال، يمكنك أيضًا تحديد علاقة one-to-one في نموذج Passport مثل:

class Passport(models.Model):
    person = models.OneToOneField(Person, on_delete=models.CASCADE, related_name='passport')
    passport_number = models.CharField(max_length=100)

في هذا المثال، يحتوي نموذج Passport على علاقة one-to-one مع نموذج Person. بحيث يحتوي نموذج Passport على OneToOneField يسمى person الذي يتم استخدامه لإنشاء علاقة مفتاح خارجي مع نموذج Person. و يتم استخدام السمة ذات الصلة لتحديد اسم العلاقة العكسية من نموذج Person إلى نموذج Passport.

يمكنك الوصول إلى الكائن ذي الصلة باستخدام السمة التي حددتها في OneToOneField. على سبيل المثال، للوصول إلى كائن Passport من كائن Person، يمكنك استخدام سمة Passport:

person = Person.objects.get(id=1)
passport = person.passport

علاقات Many-To-One

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

في Django، يمكنك استخدام حقل ForeignKey لتحديد علاقة Many-to-one بين نموذجين.و هو حقل يُستخدم لإنشاء علاقة مفتاح خارجي مع نموذج آخر.

فيما يلي مثال لكيفية تحديد علاقة Many-to-one باستخدام ForeignKey:

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100)

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

في هذا المثال، يحتوي نموذج Product على علاقة Many-to-one مع نموذج Category. كما يحتوي نموذج Product على حقل ForeignKey يسمى Category والذي يتم استخدامه لإنشاء علاقة مفتاح خارجي مع نموذج Category.

يمكنك الوصول إلى الكائن ذي الصلة باستخدام السمة التي حددتها في حقل ForeignKey . فعلى سبيل المثال، للوصول إلى كائن Category من كائن Product يمكنك استخدام سمة Category:

product = Product.objects.get(id=1)
category = product.category

و للوصول إلى كائنات Product ذات الصلة من كائن Category، يمكنك استخدام سمة Product_set:

category = Category.objects.get(id=1)
products = category.product_set.all()

يمكنك أيضًا استخدام سمة related_name لتحديد اسم مخصص للسمة المستخدمة للوصول إلى الكائنات ذات الصلة. على سبيل المثال:

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='products')

category = Category.objects.get(id=1)
products = category.products.all()

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

علاقات Many-To-Many

تُعرف علاقة Many-To-Many بأنها علاقة بين جدولين بحيث يمكن لأي صف في أحد الجداول أن يرتبط بالعديد من الصفوف في الجدول الآخر، والعكس صحيح.

في جانغو، يتم إنشاء علاقات Many-To-Many باستخدام حقل ManyToManyField في كل من النماذج المعنية. هذا الحقل يشير إلى جدول وسيط يُستخدم لتخزين معلومات العلاقة.

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

  • Authors: يتضمن هذا الجدول معلومات عن المؤلفين، مثل الاسم والعنوان والبريد الإلكتروني.
  • Books: يتضمن هذا الجدول معلومات عن الكتب، مثل العنوان والمؤلف والنشر.

نحتاج إلى علاقة Many-To-Many بين هذين الجدولين بحيث يمكن لكل مؤلف أن يكتب العديد من الكتب، ولكل كتاب أن يكون لمؤلف واحد أو أكثر.

لإنشاء هذه العلاقة، نقوم بإضافة حقل ManyToManyField إلى كل من نموذجي Authors و Books:

from django.db import models

class Authors(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField()

    books = models.ManyToManyField(to='Books')

class Books(models.Model):
    title = models.CharField(max_length=255)
    author = models.ManyToManyField(to='Authors')

يشير حقل ManyToManyField في نموذج Authors إلى النموذج Books، ويشير حقل ManyToManyField في نموذج Books إلى النموذج Authors.

عند إنشاء كائن من نموذج Authors، يمكننا الآن ربطه بالعديد من كائنات نموذج Books باستخدام التابع add():

author = Authors.objects.create(name='kader', email='kader@example.com')

book1 = Books.objects.create(title='The Hitchhiker's Guide to the Galaxy')
book2 = Books.objects.create(title='The Lord of the Rings')

author.books.add(book1)
author.books.add(book2)

سيؤدي هذا إلى إنشاء علاقة بين المؤلف kader والكتب The Hitchhiker’s Guide to the Galaxy و The Lord of the Rings.

يمكننا أيضًا استخدام التابع remove() لإزالة ارتباط بين كائنين:

author.books.remove(book2)

سيؤدي هذا إلى إزالة ارتباط المؤلف kader بالكتاب The Lord of the Rings.

بشكل عام، يتم استخدام علاقات Many-To-Many في تطبيقات جانغو عندما يحتاج نموذجان إلى أن يكونا مرتبطين ببعضهما البعض بحيث يمكن لأي صف في أحدهما أن يرتبط بالعديد من الصفوف في الآخر.

التعامل مع علاقات النماذج في Django Admin

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

للتعامل مع علاقات النماذج في إدارة Django، يمكنك استخدام فئة InlineModelAdmin. حيث تتيح لك تحديد مجموعات النماذج المضمنة للنماذج التي تحتوي على مفتاح خارجي أو علاقة many-to-many مع النموذج الأصلي.

في مثال التالي كيفية استخدام InlineModelAdmin للتعامل مع علاقات many-to-many في إدارة Django:

from django.contrib import admin

class GroupMemberInline(admin.TabularInline):
    model = Group.members.through

@admin.register(Group)
class GroupAdmin(admin.ModelAdmin):
    inlines = [GroupMemberInline]

قمنا تعريف فئة GroupMemberInline كنموذج مضمن لنموذج Group. تحدد سمة النموذج الوسيط المستخدم لإدارة علاقة many-to-many بين  Group و  Person.

للتعامل مع علاقات one-to-one في مسؤول Django، يمكنك استخدام OneToOneField بطريقة مشابهة لحقل  ForeignKey.

فيما يلي مثال لكيفية استخدام OneToOneField للتعامل مع علاقات one-to-one في مسؤول Django:

from django.contrib import admin

class PassportInline(admin.StackedInline):
    model = Passport

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    inlines = [PassportInline]

يتم تعريف فئة PassportInline كنموذج مضمن لنموذج  Person. تحدد سمة النموذج Passport المرتبط بنموذج اPerson من خلال علاقة one-to-one.

يوفر مسؤول Django طريقة ملائمة لإدارة علاقات النماذج ويمكن أن يكون أداة قيمة لإدارة تطبيق جانغو الخاص بك.

ضبط عرض العلاقات

يمكن ضبط عرض العلاقات في Django Admin باستخدام عدة طرق. يمكنك استخدام خاصية list_display لتحديد الحقول التي تريد عرضها في قائمة النماذج. يمكنك استخدام خاصيةlist_filter لإضافة عوامل تصفية إلى قائمة النماذج. و يمكنك استخدام خاصية search_fields لإضافة الحقول التي تريد البحث فيها في قائمة النماذج.

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

class ProductAdmin(admin.ModelAdmin):
    list_display = ['name', 'image_name']

كما يمكنك أيضًا استخدام خاصية inlines لضبط كيفية عرض العلاقات في Django Admin. على سبيل المثال ، إذا كان لديك نموذج منتج ونموذج صورة ، فيمكنك استخدام التعليمات البرمجية التالية لعرض الصور في شكل جدول:

class ProductAdmin(admin.ModelAdmin):
    inlines = [ImageInline(verbose_name='Images', readonly_fields=['product'])]

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

لمزيد من المعلومات حول التعامل مع علاقات النماذج في Django Admin ، يرجى الرجوع إلى وثائق Django Admin: https://docs.djangoproject.com/en/stable/ref/contrib/admin/.

اترك تعليقاً

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

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

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

Continue reading

Scroll to Top