What is the N+1 query problem in Django and how do select_related and prefetch_related solve it? Django में N+1 क्वेरी समस्या क्या है और select_related व prefetch_related इसे कैसे हल करते हैं?
The N+1 problem occurs when iterating over N objects and accessing a related object on each one triggers a separate query per iteration (because Django's ORM is lazy by default), resulting in N+1 total queries instead of one efficient join — a common and easy-to-miss performance bug in list views and templates.
select_related() solves this for forward foreign-key and one-to-one relationships by performing a SQL JOIN and fetching the related object in the same query. prefetch_related() solves it for reverse foreign-key and many-to-many relationships, where a JOIN would multiply rows, by running a second separate query and joining the results in Python instead.
orders = Order.objects.all()
for order in orders:
print(order.customer.name) # extra query every iteration
orders = Order.objects.select_related('customer')
customers = Customer.objects.prefetch_related('orders')N+1 समस्या तब होती है जब N ऑब्जेक्ट्स पर इटरेट करते समय हर एक पर संबंधित ऑब्जेक्ट एक्सेस करने से हर इटरेशन पर एक अलग क्वेरी ट्रिगर होती है (क्योंकि Django का ORM डिफ़ॉल्ट रूप से लेज़ी होता है), जिसके परिणामस्वरूप एक कुशल जॉइन के बजाय कुल N+1 क्वेरीज़ चलती हैं।
select_related() फॉरवर्ड फॉरेन-की और वन-टू-वन रिलेशनशिप के लिए इसे SQL JOIN करके और उसी क्वेरी में संबंधित ऑब्जेक्ट फेच करके हल करता है। prefetch_related() रिवर्स फॉरेन-की और मैनी-टू-मैनी रिलेशनशिप के लिए इसे एक दूसरी अलग क्वेरी चलाकर हल करता है।
orders = Order.objects.select_related('customer')
customers = Customer.objects.prefetch_related('orders')Was this answer clear?