0 Tage Serie
python / expert
Snippet

Django ORM Prefetch Objects mit Verschachtelten Relations Optimierungen

Dieses Snippet zeigt Django's fortgeschrittene Prefetch Objects für die Optimierung komplexer verschachtelter Abfragen. Durch `Prefetch` mit benutzerdefinierten `queryset`-Filtern und verkettetem `prefetch_related` reduzieren wir N+1 Abfragen auf genau 3 Abfragen unabhängig von der Datentiefe. Der `to_attr`-Parameter speichert vorgefilterte Ergebnisse in einem benutzerdefinierten Attribut.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.db.models import Prefetch
from myapp.models import Category, Product, Review
def get_categories_with_products_and_reviews():
reviews_prefetch = Prefetch(
'reviews',
queryset=Review.objects.filter(is_approved=True).select_related('author').order_by('-created_at'),
to_attr='approved_reviews'
)
products_prefetch = Prefetch(
'products',
queryset=Product.objects.filter(is_active=True).prefetch_related(reviews_prefetch),
to_attr='active_products'
)
return Category.objects.prefetch_related(products_prefetch).all()
for category in get_categories_with_products_and_reviews():
print(f"Category: {category.name}")
for product in category.active_products:
print(f" Product: {product.name}")
for review in product.approved_reviews:
print(f" Review: {review.content[:50]}")
django
Erklärung
1
from django.db.models import Prefetch
Importiert Prefetch-Objekt für benutzerdefinierte Beziehungs-Prefetching-Kontrolle
2
queryset=Review.objects.filter(...)
Benutzerdefinierter Queryset wendet serverseitige Filterung vor dem Prefetching an
3
select_related('author')
Joint Autoren-Tabelle in gleicher Abfrage um zusätzliche Treffer zu vermeiden
4
to_attr='approved_reviews'
Speichert gefilterte Ergebnisse in benanntem Attribut, umgeht Modell-Filterung
5
prefetch_related(reviews_prefetch)
Verkettet verschachteltes Prefetch für Multi-Level-Optimierung