رابطه یک به چند - ForeignKey


در این نوع رابطه، یک رکورد از مدل اول می‌تواند با چندین رکورد در مدل دوم مرتبط باشد اما هر رکورد در مدل دوم تنها می‌تواند به یک رکورد در مدل اول مرتبط باشد.. برای مثال یک پروژه در داخل وب‌سایت می‌تواند شامل چندین نظر و بازخورد باشد، ولی هر نظر و یا بازخورد تنها می‌تواند در خصوص یک پروژه باشد. در این صورت، رابطه یک به چند یا OneToMany مطرح خواهد بود. باید توجه داشت که به این رابطه چند به یک یا ManyToOne نیز گفته می‌شود و بستگی به این خواهد داشت که از کدام مدل برای مرجع قرار دادن استفاده کنیم.

در واقع فرآیندی که در سمت پایگاه داده اتفاق می­افتد به این صورت می­باشد که یک فیلد parent_id در زمان تعریف مدل شامل فیلد OneToMany بصورت خودکار به مدل اضافه می‌شود.


برای درک بهتر این موضوع، با این فرض پیش می‌رویم که یک مدل project شامل اطلاعات پروژه­ها و یک مدل review شامل بازخورد و نظرات، در خصوص پروژه‌ها خواهیم داشت که کاربران به بیان نظرات خود در خصوص پروژه­ها اقدام نموده­اند. به بیان دیگر، هر رکورد - One - از مدل project می‌تواند چندین رکورد - Many - از نظرات کاربران در مدل review را داشته باشد.

 

برای استفاده از رابطه OneToMany باید از فیلد ForeignKey استفاده گردد این فیلد در مدل review بصورت رابطه چند به یک (ManyToOne) خواهد ساخت!


نکته: در جنگو، related_name یک ویژگی (attribute) است که می‌توان هنگام تعریف یک ارتباط ForeignKey (یا دیگر انواع روابط) برای تعیین نام دسترسی از سمت مدل مرتبط استفاده نمود و امکان ساده‌تر شدن دسترسی به داده‌های مرتبط، جلوگیری از تداخل نام‌ها و افزایش خوانایی کد را فراهم می‌آورد.


نکته: جنگو برای اعمال تغییرات و یا ایجاد مدل‌های جدید مطابق با فیلدهای تعریف شده در پایگاه داده، نیاز به اجرای دستورات makemigrations و سپس migrate خواهد داشت.

نکته: برای نمایش هر مدل جدید تعربف شده در اینترفیس ادمین می­بایست آن را در فایل admin.py ثبت کنیم.