محمد دری
محمد دری
خواندن ۳ دقیقه·۲ سال پیش

روابط(Relationships) در مدل های جنگو

روابط(Relationships) در مدل های جنگو
روابط(Relationships) در مدل های جنگو


سلام خوش اومدی، من محمد دری ام و توی این پست میخوام درباره روابط بین جداول در جنگو صحبت کنم :)


مدل های جنگو به طور پیشفرض از RDBMS ها استفاده میکنه پس روابط بین جداول رو پشتیبانی میکنه. استفاده از روابط در پایگاه داده باعث بهبود عملکرد، نگهداری داده ها و داده های تکراری کمتر میشه.


مدل های جنگو از ۳ نوع رابطه پشتیبانی میکنه:

  • رابطه یک به چند - one-to-many
  • رابطه چند به چند - many-to-many
  • رابطه یک به یک - one-to-one



رابطه یک به چند(one-to-many) در مدل های جنگو

در این نوع رابطه یک رکورد از مدل میتواند با چندین رکورد از مدل دیگر مرتبط باشد. برای مثال یک منو میتواند با چندین آیتم مرتبط باشد اما یک ‌آیتم فقط متعلق به یک منو است.
توجه داشته باشید که این رابطه به صورت چند به یک(many-to-one) نیز گفته میشود و اسمش به اینکه از کدوم جدول(مدل) شروع به خوندن کنیم بستگی داره، در مثال قبل رابطه یک به چند از Menu به Item وجود داره همچنین رابطه چند به یک از Item به Menu نیز وجود داره.
برای استفاده از رابطه one-to-many در مدل های جنگو باید از فیلد ForeignKey استفاده کنید و این فیلد رابطه چند به یک(many-to-one) رو برای ما میسازه، پس در مثال ما باید این فیلد رو درون مدل Item قرار بدیم!

نحوه تعریف ForeignKey برای ایجاد رابطه میان مدل های Item و Menu
نحوه تعریف ForeignKey برای ایجاد رابطه میان مدل های Item و Menu


برای استفاده از دو مدل Menu و Item هم میتونید مانند مثال زیر آبجکت هاتون رو بسازید و با یکی از این ۲ روش تمام item های یک menu رو دریافت کنید.

ساخت آبجکت های menu و item و گرفتن تمام item های یک منو
ساخت آبجکت های menu و item و گرفتن تمام item های یک منو


رابطه چند به چند(many-to-many) در مدل های جنگو

در این نوع رابطه چند رکورد از مدل میتواند با چندین رکورد از مدل دیگر مرتبط باشند. برای مثال یک نویسنده میتواند با چندین کتاب مرتبط باشد و همینطور یک ‌کتاب نیز میتواند متعلق به چندین نویسنده باشد.
برای استفاده از رابطه many-to-many در مدل های جنگو باید از فیلد ManyToManyField استفاده کنید و این فیلد رابطه چند به چند(many-to-many) رو برای ما میسازه، چون خصوصیت authors در مدل کتاب وجود داره ما این فیلد رو در مدل Book قرار میدیم.

نحوه تعریف ManyToManyField برای ایجاد رابطه میان مدل های Author و Book
نحوه تعریف ManyToManyField برای ایجاد رابطه میان مدل های Author و Book


برای استفاده از دو مدل Author و Book هم میتونید مانند مثال زیر آبجکت هاتون رو بسازید و با یکی از این روش ها تمام کتاب های یک نویسنده رو دریافت کنید.

ساخت آبجکت های book و author و گرفتن تمام کتاب های یک نویسنده
ساخت آبجکت های book و author و گرفتن تمام کتاب های یک نویسنده


رابطه یک به یک(one-to-one) در مدل های جنگو

در این نوع رابطه یک رکورد از مدل فقط میتواند با یک رکورد از مدل دیگر مرتبط باشند. برای مثال یک کاربر فقط میتواند یک پروفایل داشته باشد و همینطور یک ‌پروفایل نیز فقط متعلق به یک کاربر است.
برای استفاده از رابطه one-to-one در مدل های جنگو باید از فیلد OneToOneField استفاده کنید و این فیلد رابطه یک به یک(one-to-one) رو برای ما میسازه، چون خصوصیت user در مدل پروفایل وجود داره ما این فیلد رو در مدل Profile قرار میدیم. در این مثال ما از مدل User پیشفرض جنگو استفاده میکنیم.

نحوه تعریف OneToOneField برای ایجاد رابطه میان مدل های User و Profile
نحوه تعریف OneToOneField برای ایجاد رابطه میان مدل های User و Profile


برای استفاده از دو مدل User و Profile هم میتونید مانند مثال زیر آبجکت هاتون رو بسازید و با یکی از این روش ها پروفایل کاربر مد نظرتون رو دریافت کنید.

ساخت آبجکت های user و profile و گرفتن پروفایل هر کاربر
ساخت آبجکت های user و profile و گرفتن پروفایل هر کاربر



هر سوالی داشتی در خدمتم :)
ایمیل mr.dori.dev@gmail.com
گیت هاب github.com/dori-dev
تلگرام Mohamad_Dori
اینستاگرام mr.dori.dev
یوتیوب Mohammad Dori
آپارات dori.dev


برای اطلاعات بیشتر هم میتونید به داکیومنت جنگو مراجعه کنید:
many-to-one - many-to-many - one-to-one

مدل‌های جنگوجنگودیتابیسdjangopython
تلگرام t.me/Mohamad_Dori | گیت‌هاب github.com/dori-dev | ایمیل mr.dori.dev@gmail.com
شاید از این پست‌ها خوشتان بیاید