یکی از شایعترین علل کندی برنامههای توسعه داده شده با فریمورک جنگو، ایجاد درخواستهای متعدد و غیرضروری به پایگاهداده است که به مسئله N+1 Queries معروف است.
چرا این مشکل رخ میدهد؟
جنگو به صورت پیشفرض کوئریها را به صورت تنبل (Lazy Evaluation) اجرا میکند. هنگامی که در یک حلقه روی مجموعهای از اشیاء گردش میکنید و به روابط ForeignKey یا ManyToMany دسترسی پیدا میکنید، جنگو برای هر رکورد یک کوئری جداگانه ارسال مینماید.
راهکار: استفاده هوشمندانه از select_related و prefetch_related
برای روابط OneToOne و ForeignKey همواره از select_related استفاده کنید تا دیتابیس با یک JOIN کارآمد تمام دادهها را بازگرداند. برای فیلدهای ManyToMany نیز prefetch_related معجزه میکند.
همواره قبل از بردن کد به پروداکشن، تعداد کوئریها را با ابزارهایی مانند django-debug-toolbar ارزیابی نمایید.