python / expert
Snippet
Django Model Meta Options with Custom Manager Chaining
This snippet showcases Django's powerful Model Meta options and custom manager chaining. The Article model implements a layered manager approach where PublishedManager extends ActiveManager, creating a chain of filtered querysets. The Meta class defines composite indexes for performance, database-level constraints for data integrity, and default ordering. Custom classmethods provide user-specific visibility logic.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from django.db import modelsfrom django.db.models import Qfrom django.utils import timezoneclass ActiveManager(models.Manager):def get_queryset(self):return super().get_queryset().filter(is_active=True)class PublishedManager(ActiveManager):def get_queryset(self):return super().get_queryset().filter(Q(published_at__isnull=True) | Q(published_at__lte=timezone.now()))class Article(models.Model):title = models.CharField(max_length=200)slug = models.SlugField(unique=True)content = models.TextField()is_active = models.BooleanField(default=True)published_at = models.DateTimeField(null=True, blank=True)author = models.ForeignKey('auth.User', on_delete=models.CASCADE)created_at = models.DateTimeField(auto_now_add=True)objects = models.Manager()active = ActiveManager()published = PublishedManager()class Meta:indexes = [models.Index(fields=['slug']),models.Index(fields=['-published_at', 'is_active']),]constraints = [models.UniqueConstraint(fields=['author', 'slug'],name='unique_author_slug')]ordering = ['-created_at']verbose_name = 'Article'verbose_name_plural = 'Articles'def __str__(self):return self.title@classmethoddef get_visible_for_user(cls, user):if user.is_staff:return cls.objects.all()return cls.published.all()
django
Breakdown
1
class ActiveManager(models.Manager):
Create custom manager that filters for active records, reusable across multiple models
2
objects = models.Manager(); active = ActiveManager(); published = PublishedManager()
Assign multiple manager instances to the model enabling different query perspectives simultaneously
3
models.Index(fields=['-published_at', 'is_active'])
Define composite index with descending order for efficient chronological queries with status filtering
4
models.UniqueConstraint(fields=['author', 'slug'])
Add database-level constraint ensuring author-slug combination uniqueness at the database level
5
@classmethod def get_visible_for_user(cls, user):
Create classmethod that returns appropriate queryset based on user permissions for visibility logic