Django ORM Queries کو بہتر بنانا

Django ORM ڈیٹا بیس کے کام کو آسان بنا دیتا ہے۔ لیکن یہ ایک خطرہ بھی چھپاتا ہے۔ اگر آپ متعلقہ (related) اشیاء کو غلط طریقے سے حاصل کرتے ہیں، تو آپ N+1 query کا مسئلہ پیدا کر دیتے ہیں۔

اس کا مطلب یہ ہے کہ اگر آپ 100 پوسٹس حاصل کرتے ہیں، تو آپ کی ایپ 101 queries چلا سکتی ہے۔ یہ آپ کی ایپ کی رفتار کو انتہائی سست کر دیتا ہے۔

اسے ٹھیک کرنے کے لیے ان دو ٹولز کا استعمال کریں:

  1. select_related

اسے ForeignKey اور OneToOneField کے لیے استعمال کریں۔

یہ SQL JOIN کا استعمال کرتا ہے۔ یہ متعلقہ ڈیٹا کو ایک ہی query میں حاصل کر لیتا ہے۔

  • مثال: Post کا ایک Author ہوتا ہے۔
  • عام طریقہ: 100 پوسٹس کے لیے 101 queries۔
  • بہتر طریقہ: .select_related("author") کا استعمال کرتے ہوئے 1 query۔
  1. prefetch_related

اسے ManyToManyField اور reverse ForeignKeys کے لیے استعمال کریں۔

یہ الگ الگ queries چلاتا ہے اور انہیں Python میں جوڑ دیتا ہے۔

  • مثال: Post کے بہت سے Tags ہوتے ہیں۔
  • عام طریقہ: پوسٹس کے لیے 1 query + ہر ایک پوسٹ کے tags کے لیے 1 query۔
  • بہتر طریقہ: .prefetch_related("tags") کا استعمال کرتے ہوئے کل 2 queries۔

ماہرانہ مشورے (Pro Tips):

  • متعلقہ ڈیٹا کو اپنے loop میں آنے سے پہلے فلٹر کرنے کے لیے Prefetch object کا استعمال کریں۔
  • انہیں ایک ساتھ استعمال کریں (Chain them)۔ آپ ایک ہی queryset میں دونوں کا استعمال کر کے ایک ہی وقت میں authors اور tags حاصل کر سکتے ہیں۔
  • لوپ (loop) کے اندر کسی prefetched relationship پر .filter() کال کرنے سے گریز کریں۔ یہ cache کو نظر انداز کر دیتا ہے اور دوبارہ ڈیٹا بیس تک پہنچتا ہے۔
  • صرف وہی کالمز حاصل کرنے کے لیے جو آپ کو ضرورت ہیں، select_related کے ساتھ .only() کا استعمال کریں۔

خلاصہ:

  • ForeignKey / OneToOne: select_related استعمال کریں۔
  • ManyToMany / Reverse FK: prefetch_related استعمال کریں۔

ان مسائل کو جلد دریافت کرنے کے لیے django-debug-toolbar کے ذریعے اپنی query counts چیک کریں۔

ماخذ: https://dev.to/fhva29/optimizing-django-orm-queries-a-practical-guide-to-selectrelated-and-prefetchrelated-1gpl