Django ORM Queries ऑप्टिमाइझ करणे

Django ORM डेटाबेसचे काम सोपे करते. परंतु, त्यामध्ये एक धोका दडलेला असतो. जर तुम्ही संबंधित ऑब्जेक्ट्स (related objects) चुकीच्या पद्धतीने फेच केले, तर तुम्ही N+1 query समस्या निर्माण करता.

याचा अर्थ असा की जर तुम्ही १०० पोस्ट्स फेच केल्या, तर तुमचे ॲप १०१ क्वेरीज रन करू शकते. यामुळे तुमचे ॲप अत्यंत संथ होते.

हे सुधारण्यासाठी या दोन टूल्सचा वापर करा:

  1. select_related

ForeignKey आणि OneToOneField साठी याचा वापर करा.

हे SQL JOIN वापरते. हे संबंधित डेटा एकाच क्वेरीमध्ये मिळवते.

  • उदाहरण: Post कडे एक Author आहे.
  • साधी पद्धत: १०० पोस्ट्ससाठी १०१ क्वेरीज.
  • ऑप्टिमाइझ केलेली पद्धत: .select_related("author") वापरून १ क्वेरी.
  1. prefetch_related

ManyToManyField आणि reverse ForeignKeys साठी याचा वापर करा.

हे स्वतंत्र क्वेरीज रन करते आणि त्यांना Python मध्ये जॉइन करते.

  • उदाहरण: Post कडे अनेक Tags आहेत.
  • साधी पद्धत: पोस्ट्ससाठी १ क्वेरी + प्रत्येक पोस्टच्या टॅग्ससाठी १ क्वेरी.
  • ऑप्टिमाइझ केलेली पद्धत: .prefetch_related("tags") वापरून एकूण २ क्वेरीज.

Pro Tips:

  • लूपमध्ये जाण्यापूर्वी संबंधित डेटा फिल्टर करण्यासाठी Prefetch ऑब्जेक्टचा वापर करा.
  • त्यांना एकत्र साखळीकृत (chain) करा. तुम्ही एकाच queryset मध्ये दोन्ही वापरून authors आणि tags एकाच वेळी मिळवू शकता.
  • लूपच्या आत prefetched रिलेशनशिपवर .filter() कॉल करणे टाळा. यामुळे कॅशे (cache) बायपास होतो आणि डेटाबेस पुन्हा हिट होतो.
  • तुम्हाला आवश्यक असलेले फक्त कॉलम्स फेच करण्यासाठी select_related सोबत .only() वापरा.

Summary:

  • ForeignKey / OneToOne: select_related वापरा.
  • ManyToMany / Reverse FK: prefetch_related वापरा.

या समस्या लवकर शोधण्यासाठी django-debug-toolbar वापरून तुमच्या क्वेरी काउंट्स तपासा.

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