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
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, Prefetchfrom django.db.models.functions import TruncMonthclass 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)# Usagebooks = 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