0 day streak
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
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from django.db import models
from django.db.models import Q
from django.utils import timezone
class 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
@classmethod
def 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