يدعم 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/.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.