ارتباطات بین مدلها
در جنگو، مدلها میتوانند ارتباطات مختلفی با یکدیگر داشته باشند که این ارتباطات به طور مستقیم به ساختار پایگاه داده و نحوه ذخیرهسازی دادهها ارتباط دارند. سه نوع ارتباط اصلی در جنگو عبارتند از: یک به یک (One-to-One)، یک به چند (One-to-Many) و چند به چند (Many-to-Many). در ادامه به توضیح هر یک از این ارتباطات پرداخته میشود.
۱. ارتباط یک به یک (One-to-One)
در ارتباط یک به یک، هر شیء از یک مدل به طور یکتا با یک شیء از مدل دیگر مرتبط است. به این معنی که هر رکورد از یک مدل فقط میتواند با یک رکورد از مدل دیگر مرتبط باشد. این نوع ارتباط معمولاً زمانی استفاده میشود که بخواهید اطلاعات بیشتری را برای یک مدل خاص ذخیره کنید، بدون اینکه بخواهید دادههای تکراری ذخیره کنید.
در جنگو از فیلد OneToOneField برای ایجاد ارتباط یک به یک استفاده میشود.
مثال:
user = models.OneToOneField(User, on_delete=models.CASCADE) # هر کاربر یک پروفایل دارد
bio = models.TextField()
class User(models.Model):
username = models.CharField(max_length=100)
email = models.EmailField()
در این مثال، هر User یک Profile خاص خود دارد و هر Profile فقط به یک User مرتبط است.
۲. ارتباط یک به چند (One-to-Many)
در ارتباط یک به چند، هر شیء از یک مدل میتواند با چندین شیء از مدل دیگر مرتبط باشد، اما هر شیء از مدل دوم تنها به یک شیء از مدل اول مرتبط است. این نوع ارتباط به طور معمول زمانی استفاده میشود که یک رکورد در یک مدل میتواند به چندین رکورد در مدل دیگر اشاره کند.
در جنگو برای ایجاد این نوع ارتباط از فیلد ForeignKey استفاده میشود.
مثال:
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE) # هر کتاب یک نویسنده دارد
در اینجا، هر Book به یک Author خاص مربوط میشود، اما یک Author میتواند چندین Book داشته باشد.
۳. ارتباط چند به چند (Many-to-Many)
در ارتباط چند به چند، هر شیء از یک مدل میتواند با چندین شیء از مدل دیگر مرتبط باشد و بالعکس. این نوع ارتباط معمولاً زمانی استفاده میشود که بخواهید ارتباطات پیچیدهتری بین دو مدل برقرار کنید، مثلاً زمانی که یک دانشآموز میتواند در چندین کلاس ثبتنام کند و هر کلاس میتواند چندین دانشآموز داشته باشد.
در جنگو برای ایجاد ارتباط چند به چند از فیلد ManyToManyField استفاده میشود.
مثال:
name = models.CharField(max_length=100)
class Course(models.Model):
title = models.CharField(max_length=100)
students = models.ManyToManyField(Student) # هر دانشآموز میتواند در چندین دوره شرکت کند
در اینجا، هر Course میتواند چندین Student داشته باشد و هر Student میتواند در چندین Course ثبتنام کند.
جمعبندی
- ارتباط یک به یک (OneToOneField): هر رکورد از یک مدل فقط با یک رکورد از مدل دیگر مرتبط است.
- ارتباط یک به چند (ForeignKey): هر رکورد از یک مدل میتواند با چندین رکورد از مدل دیگر مرتبط باشد، اما هر رکورد از مدل دوم تنها به یک رکورد از مدل اول مرتبط است.
- ارتباط چند به چند (ManyToManyField): هر رکورد از یک مدل میتواند با چندین رکورد از مدل دیگر مرتبط باشد و بالعکس.
این سه نوع ارتباط به شما کمک میکنند که ساختار دادههای پیچیدهتری را در جنگو مدلسازی کنید و پایگاه داده خود را به طور مؤثری طراحی کنید.
