0 Tage Serie
python / intermediate
Snippet

Django ORM QuerySet-Verkettung und Aggregation

Django QuerySets unterstützen Methodenverkettung für komplexe Abfragen. select_related() führt SQL-Joins für ForeignKey-Beziehungen aus (einzelne Abfrage), während prefetch_related() ManyToMany mit separaten Abfragen optimiert. Aggregationsfunktionen wie Count und Avg berechnen Statistiken. Q-Objekte bauen komplexe OR/AND-Bedingungen. Custom Managers kapseln wiederverwendbare Abfragelogik und halten Modelle sauber und testbar.

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
23
24
25
26
27
28
29
30
from django.db.models import Count, Avg, Q, F, Prefetch
from django.db.models.functions import TruncMonth
class BookManager(models.Manager):
def get_published_with_authors(self):
return self.get_queryset().filter(
is_published=True
).select_related('author').prefetch_related(
Prefetch('collaborators', queryset=Author.objects.only('id', 'name'))
)
def monthly_publication_stats(self):
return self.get_queryset().filter(
is_published=True
).annotate(
month=TruncMonth('published_date')
).values('month').annotate(
book_count=Count('id'),
avg_rating=Avg('rating')
).order_by('-month')
def search_books(self, query, min_rating=None):
filters = Q(title__icontains=query) | Q(description__icontains=query)
if min_rating:
filters &= Q(rating__gte=min_rating)
return self.filter(filters)
# Usage
books = Book.objects.search_books('python', min_rating=4.0)
top_rated = books.order_by('-rating')[:5]
django
Erklärung
1
select_related('author')
Holt ForeignKey-Beziehungen in einem einzigen SQL-JOIN und vermeidet N+1-Abfragen
2
Prefetch('collaborators', queryset=...)
Optimiert ManyToMany mit separater Abfrage und begrenzt Felder auf das Notwendige
3
Q(title__icontains=query) | Q(description__icontains=query)
Q-Objekte kombinieren Bedingungen mit OR; & für AND, ~ für NOT
4
TruncMonth('published_date')
Kürzt datetime auf Monat für das Gruppieren von Veröffentlichungen nach Monat