python / intermediate
Snippet
Django QuerySet-Optimierung mit select_related und prefetch_related
Djangos QuerySet-Optimierungsmethoden reduzieren Datenbankabfragen drastisch durch SQL JOINs oder effizienteSeparate Abfragen. select_related verfolgt ForeignKey- und OneToOne-Beziehungen in einem einzigen JOIN, während prefetch_related zusätzliche Abfragen durchführt und das Verknüpfen in Python erledigt - unerlässlich für ManyToMany- und reverse ForeignKey-Beziehungen. Bei einem typischen Blog mit 10 Artikeln, jeweils mit Autor und 5 Kommentaren, erzeugt der naive Zugriff 1 + 10 + 10*5 = 61 Abfragen. Mit diesen Optimierungen sinkt es auf nur 4 Abfragen.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ArticleView(ListView):model = Articletemplate_name = 'articles.html'def get_queryset(self):return Article.objects.select_related('author', 'category')\.prefetch_related('tags', 'comments__author')# Equivalent raw query analysis:# select_related: Uses SQL JOINs for ForeignKey/OneToOne (1:1 relationships)# prefetch_related: Performs separate queries with Python joining (1:N, M:N)# Debug generated queries:# from django.db import connection# print(connection.queries)
django
Erklärung
1
select_related('author', 'category')
Erstellt SQL JOIN für ForeignKey-Beziehungen - einzelne Abfrage holt verknüpfte Objekte
2
.prefetch_related('tags', 'comments__author')
Separate Abfragen für M:N und reverse FK, dann Verknüpfung im Python-Speicher
3
comments__author
Doppelter Unterstrich navigiert verschachtelte Beziehungen für prefetching