سلام خوش اومدی، من محمد دری ام و توی این پست میخوام درباره روابط بین جداول در جنگو صحبت کنم :)
مدل های جنگو به طور پیشفرض از RDBMS ها استفاده میکنه پس روابط بین جداول رو پشتیبانی میکنه. استفاده از روابط در پایگاه داده باعث بهبود عملکرد، نگهداری داده ها و داده های تکراری کمتر میشه.
در این نوع رابطه یک رکورد از مدل میتواند با چندین رکورد از مدل دیگر مرتبط باشد. برای مثال یک منو میتواند با چندین آیتم مرتبط باشد اما یک آیتم فقط متعلق به یک منو است.
توجه داشته باشید که این رابطه به صورت چند به یک(many-to-one) نیز گفته میشود و اسمش به اینکه از کدوم جدول(مدل) شروع به خوندن کنیم بستگی داره، در مثال قبل رابطه یک به چند از Menu به Item وجود داره همچنین رابطه چند به یک از Item به Menu نیز وجود داره.
برای استفاده از رابطه one-to-many در مدل های جنگو باید از فیلد ForeignKey استفاده کنید و این فیلد رابطه چند به یک(many-to-one) رو برای ما میسازه، پس در مثال ما باید این فیلد رو درون مدل Item قرار بدیم!
برای استفاده از دو مدل Menu و Item هم میتونید مانند مثال زیر آبجکت هاتون رو بسازید و با یکی از این ۲ روش تمام item های یک menu رو دریافت کنید.
در این نوع رابطه چند رکورد از مدل میتواند با چندین رکورد از مدل دیگر مرتبط باشند. برای مثال یک نویسنده میتواند با چندین کتاب مرتبط باشد و همینطور یک کتاب نیز میتواند متعلق به چندین نویسنده باشد.
برای استفاده از رابطه many-to-many در مدل های جنگو باید از فیلد ManyToManyField استفاده کنید و این فیلد رابطه چند به چند(many-to-many) رو برای ما میسازه، چون خصوصیت authors در مدل کتاب وجود داره ما این فیلد رو در مدل Book قرار میدیم.
برای استفاده از دو مدل Author و Book هم میتونید مانند مثال زیر آبجکت هاتون رو بسازید و با یکی از این روش ها تمام کتاب های یک نویسنده رو دریافت کنید.
در این نوع رابطه یک رکورد از مدل فقط میتواند با یک رکورد از مدل دیگر مرتبط باشند. برای مثال یک کاربر فقط میتواند یک پروفایل داشته باشد و همینطور یک پروفایل نیز فقط متعلق به یک کاربر است.
برای استفاده از رابطه one-to-one در مدل های جنگو باید از فیلد OneToOneField استفاده کنید و این فیلد رابطه یک به یک(one-to-one) رو برای ما میسازه، چون خصوصیت user در مدل پروفایل وجود داره ما این فیلد رو در مدل Profile قرار میدیم. در این مثال ما از مدل User پیشفرض جنگو استفاده میکنیم.
برای استفاده از دو مدل 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