Kuboresha Django ORM Queries

Django ORM inafanya kazi za kanzi data (database) kuwa rahisi. Lakini inaficha hatari fulani. Ukichukua (fetch) vitu vinavyohusiana vibaya, unasababisha tatizo la N+1 query.

Hii inamaanisha ikiwa utachukua machapisho (posts) 100, programu yako inaweza kuendesha query 101. Hii inafanya programu yako iwe nzito na kusimama kabisa.

Tumia zana hizi mbili kuzitatua:

  1. select_related

Tumia hii kwa ForeignKey na OneToOneField.

Inatumia SQL JOIN. Inapata data zinazohusiana katika query moja tu.

  • Mfano: Post ina Mwandishi (Author) mmoja.
  • Njia isiyo bora: query 101 kwa machapisho 100.
  • Njia iliyoboreshwa: query 1 kwa kutumia .select_related("author").
  1. prefetch_related

Tumia hii kwa ManyToManyField na reverse ForeignKeys.

Inarun query tofauti na kuziunganisha ndani ya Python.

  • Mfano: Post ina lebo (Tags) nyingi.
  • Njia isiyo bora: query 1 kwa machapisho + query 1 kwa kila lebo ya kila chapisho.
  • Njia iliyoboreshwa: jumla ya query 2 kwa kutumia .prefetch_related("tags").

Vidokezo vya Kitaalamu:

  • Tumia object ya Prefetch kuchuja data zinazohusiana kabla hazijafika kwenye loop yako.
  • Ziunganishe (Chain them). Unaweza kutumia zote mbili kwenye queryset moja ili kupata waandishi na lebo kwa wakati mmoja.
  • Epuka kuitumia .filter() kwenye uhusiano ulioprefetch ndani ya loop. Hii inavuka cache na kugonga kanzi data tena.
  • Tumia .only() pamoja na select_related ili kuchukua safu (columns) unazohitaji tu.

Muhtasari:

  • ForeignKey / OneToOne: Tumia select_related.
  • ManyToMany / Reverse FK: Tumia prefetch_related.

Angalia idadi ya query zako kwa kutumia django-debug-toolbar ili kugundua matatizo haya mapema.

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