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
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 Prefetchfrom myapp.models import Category, Product, Reviewdef 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