Django ORM ક્વેરીઝનું ઓપ્ટિમાઇઝેશન

Django ORM ડેટાબેઝનું કામ સરળ બનાવે છે. પરંતુ તે એક જોખમ છુપાવે છે. જો તમે સંબંધિત (related) ઓબ્જેક્ટ્સને ખોટી રીતે ફેચ કરો છો, તો તમે N+1 ક્વેરી સમસ્યા ઊભી કરો છો.

આનો અર્થ એ છે કે જો તમે 100 પોસ્ટ્સ ફેચ કરો છો, તો તમારી એપ 101 ક્વેરીઝ ચલાવી શકે છે. આ તમારી એપની ગતિ ધીમી કરી દે છે.

તેને સુધારવા માટે આ બે ટૂલ્સનો ઉપયોગ કરો:

  1. select_related

આનો ઉપયોગ ForeignKey અને OneToOneField માટે કરો.

તે SQL JOIN નો ઉપયોગ કરે છે. તે સિંગલ ક્વેરીમાં સંબંધિત ડેટા મેળવે છે.

  • ઉદાહરણ: Post પાસે એક Author છે.
  • સામાન્ય રીત: 100 પોસ્ટ્સ માટે 101 ક્વેરીઝ.
  • ઓપ્ટિમાઇઝ્ડ રીત: .select_related("author") નો ઉપયોગ કરીને 1 ક્વેરી.
  1. prefetch_related

આનો ઉપયોગ ManyToManyField અને reverse ForeignKeys માટે કરો.

તે અલગ-અલગ ક્વેરીઝ ચલાવે છે અને તેને Python માં જોડે છે.

  • ઉદાહરણ: Post પાસે ઘણા Tags છે.
  • સામાન્ય રીત: પોસ્ટ્સ માટે 1 ક્વેરી + દરેક પોસ્ટના ટેગ્સ માટે 1 ક્વેરી.
  • ઓપ્ટિમાઇઝ્ડ રીત: .prefetch_related("tags") નો ઉપયોગ કરીને કુલ 2 ક્વેરીઝ.

Pro Tips:

  • તમારા લૂપમાં પહોંચતા પહેલા સંબંધિત ડેટાને ફિલ્ટર કરવા માટે Prefetch object નો ઉપયોગ કરો.
  • તેમને એકસાથે ચેઈન કરો. તમે એકસાથે authors અને tags મેળવવા માટે એક જ queryset માં બંનેનો ઉપયોગ કરી શકો છો.
  • લૂપની અંદર 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