𝗢𝗽𝘁𝗶𝗺𝗶𝘀𝗲𝗿𝗲𝗻 𝘃𝗮𝗻 𝗗𝗷𝗮𝗻𝗴𝗼 𝗢𝗥𝗠-𝗤𝘂𝗲𝗿𝗶𝗲𝘀
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:
- 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").
- 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.