python / expert
Snippet
Django Custom Manager mit Method Chaining und Lazy Evaluation
Custom Django Manager ermöglichen wiederverwendbare Querysets mit Method Chaining. Durch Vererbung von models.Manager und Verkettung von .filter()-Aufrufen erstellst du lazy Querysets, die erst gegen die Datenbank ausgeführt werden, wenn sie iteriert werden. Der published Manager wird in Article komponiert und ermöglicht sowohl Article.objects als auch Article.published Zugriffsmuster, während DRY-Prinzipien durch Vererbung gewahrt werden.
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
31
32
33
34
from django.db import modelsclass PublishedManager(models.Manager):def for_user(self, user):return self.filter(author=user)def published(self):return self.filter(status='published')class ArticleManager(PublishedManager):def with_related(self):return self.select_related('author', 'category').prefetch_related('tags')def in_category(self, category):return self.filter(category__slug=category)class Article(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey('auth.User', on_delete=models.CASCADE)category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)tags = models.ManyToManyField('Tag')status = models.CharField(max_length=20, default='draft')created_at = models.DateTimeField(auto_now_add=True)objects = ArticleManager()published = PublishedManager()class Meta:ordering = ['-created_at']# Usage with method chainingarticles = Article.objects.for_user(request.user).published().with_related()
django
Erklärung
1
class PublishedManager(models.Manager):
Basis-Manager mit Kernmethoden für Queryset-Filterung
2
def for_user(self, user): return self.filter(author=user)
Gibt gefiltertes Queryset nach Autor zurück, lazy Evaluation beginnt hier
3
class ArticleManager(PublishedManager):
Erweitert Basis-Manager mit Vererbung von for_user und published Methoden
4
def with_related(self): return self.select_related('author', 'category')...
Optimiert Query mit JOINs und Prefetches zur Vermeidung des N+1-Problems
5
objects = ArticleManager()
Standard Manager-Kette für Article.objects
6
published = PublishedManager()
Komponierter Manager mit nur veröffentlichtem Filtern