𝗢𝗽𝘁𝗶𝗺𝗶𝘀𝗲𝗿𝗲𝗻 𝘃𝗮𝗻 𝗗𝗷𝗮𝗻𝗴𝗼 𝗢𝗥𝗠-𝗤𝘂𝗲𝗿𝗶𝗲𝘀

Django ORM maakt databasebeheer eenvoudig. Maar het verbergt een gevaar. Als je gerelateerde objecten op een inefficiënte manier ophaalt, creëer je het N+1-queryprobleem.

Dit betekent dat als je 100 posts ophaalt, je app mogelijk 101 queries uitvoert. Dit vertraagt je app tot stilstand.

Gebruik deze twee tools om het op te lossen:

  1. select_related

Gebruik dit voor ForeignKey en OneToOneField.

Het gebruikt een SQL JOIN. Het haalt de gerelateerde gegevens op in één enkele query.

  • Voorbeeld: Een Post heeft één Auteur.
  • Naïeve manier: 101 queries voor 100 posts.
  • Geoptimaliseerde manier: 1 query met behulp van .select_related("author").
  1. prefetch_related

Gebruik dit voor ManyToManyField en reverse ForeignKeys.

Het voert aparte queries uit en voegt deze samen in Python.

  • Voorbeeld: Een Post heeft veel Tags.
  • Naïeve manier: 1 query voor de posts + 1 query voor de tags van elke afzonderlijke post.
  • Geoptimaliseerde manier: in totaal 2 queries met behulp van .prefetch_related("tags").

Pro Tips:

  • Gebruik het Prefetch-object om gerelateerde gegevens te filteren voordat ze je loop bereiken.
  • Koppel ze aan elkaar. Je kunt beide in één queryset gebruiken om tegelijkertijd auteurs en tags op te halen.
  • Vermijd het aanroepen van .filter() op een prefetched relatie binnen een loop. Dit omzeilt de cache en maakt opnieuw een aanroep naar de database.
  • Gebruik .only() met select_related om alleen de kolommen op te halen die je nodig hebt.

Samenvatting:

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

Controleer je query-aantallen met django-debug-toolbar om deze problemen vroegtijdig te ontdekken.

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