Django
Beginner
1 min read
Django ORM Queries and Managers
Example
# blog/models.py — custom manager + ORM query examples
from django.db import models
from django.utils import timezone
class PublishedManager(models.Manager):
"""Return only published posts."""
def get_queryset(self):
return super().get_queryset().filter(status=Post.STATUS_PUBLISHED)
def recent(self, count=10):
return self.get_queryset().order_by('-published_at')[:count]
class Post(models.Model):
STATUS_DRAFT = 'draft'
STATUS_PUBLISHED = 'published'
STATUS_CHOICES = [(STATUS_DRAFT, 'Draft'), (STATUS_PUBLISHED, 'Published')]
title = models.CharField(max_length=200)
body = models.TextField()
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default=STATUS_DRAFT)
published_at = models.DateTimeField(null=True, blank=True)
objects = models.Manager() # default manager
published = PublishedManager() # custom manager
class Meta:
ordering = ['-published_at']
# --- ORM usage examples (e.g. in a view or shell) ---
# All published posts
posts = Post.published.all()
# Filter + chain
recent = Post.published.filter(published_at__year=2024).order_by('-published_at')
# Avoid N+1: fetch author in same query
from .models import Post
posts = Post.published.select_related('author', 'category').recent(5)
# Aggregate
from django.db.models import Count
stats = Post.objects.values('status').annotate(total=Count('id'))
Related Resources
Django Reference
Complete tag & property list
Django How-To Guides
Step-by-step practical guides
Django Exercises
Practice what you've learned
More in Django