python / expert
Snippet
Django Custom Manager with Method Chaining and Lazy Evaluation
Custom Django managers enable reusable querysets with method chaining. By inheriting from models.Manager and chaining .filter() calls, you create lazy querysets that only execute against the database when iterated. The published manager is composed into Article, allowing both Article.objects and Article.published access patterns while maintaining DRY principles through inheritance.
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
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
Breakdown
1
class PublishedManager(models.Manager):
Base manager providing core queryset filtering methods
2
def for_user(self, user): return self.filter(author=user)
Returns queryset filtered by author, lazy evaluation starts here
3
class ArticleManager(PublishedManager):
Extends base manager inheriting for_user and published methods
4
def with_related(self): return self.select_related('author', 'category')...
Optimizes query with JOINs and prefetches to prevent N+1 problem
5
objects = ArticleManager()
Default manager chain for Article.objects
6
published = PublishedManager()
Composed manager exposing only published filtering