رابطه چند به چند - ManyToMany



در این نوع رابطه چند رکورد از یک مدل می‌تواند با چندین رکورد از مدل دیگر مرتبط باشند. برای مثال یک پروژه در وب‌سایت بر مبنای بستر پیاده‌سازی آن پروژه، می‌تواند چندین برچسب یا تگ از جمله Python، React و ... داشته باشد و همینطور یک برچسب نیز می‌تواند متعلق به چندین پروژه باشد.


در واقع برای این نوع رابطه، در سمت پایگاه داده، فرآیندی که اتفاق می­افتد به این صورت می­باشد که یک جدول میانی توسط جنگو هنگام تعریف گزینه ManyToMany به­صورت خودکار ایجاد شده و هربار که یک تگ به یک پروژه اختصاص می­یابد، جنگو یک رکورد به جدول میانی از رابطه ایجاد شده اضافه می‌کند.

برای استفاده از رابطه ManyToMany در مدل‌های جنگو باید از فیلد ManyToManyField استفاده کرد و این فیلد رابطه چند به چند را خواهد ساخت، چون خصوصیت تگ در مدل پروژه وجود دارد، ما این فیلد را در مدل projects قرار خواهیم داد.


پس از ایجاد مدل tag، حال می­بایست نسبت به تعریف فیلد ManyToMany در مدل projects اقدام کنیم

نکته: ذکر این نکته حائز اهمیت می­باشد که بعد از ایجاد و یا انجام هر تغییری در ساختار مدل­ها، می­بایست دستورات makemigrations و سپس migrate را اجرا کنیم تا تغییرات در پایگاه داده نیز اعمال شوند؛ و همچنین بعد از ایجاد هر مدل، می­بایست نسبت به ثبت آن در اینترفیس ادمین از مسیر فایل admin.py از داخل دایرکتوری اپ اقدام کرد:


coreapp/admin.py

حال که تمامی مراحل فرایند ایجاد، تغییر و ثبت مدل­ها را طی کردیم، نگاهی به نحوه عملکرد فیلد ManyToMany تعریف شده در مدل projects خواهیم انداخت. قبل از انجام آن می­بایست چند آیتم در جدول tag اضافه کنیم تا درک بهتری از نحوه عملکرد داشته باشیم.

در اینجا لیستی از تگ­ها به جدول tag اضافه کردیم. حال اگر به سراغ آیتم­های مدل projects برویم، فیلد tags ایجاد شده به این صورت خواهد بود.