Deep Dive: Django Models and Querysets for Python Developers
Django's ORM is one of the most powerful tools in Python web development. Let's master it.
Model Definition
from django.db import models
from django.contrib.auth.models import User
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
published = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
tags = models.ManyToManyField('Tag', blank=True)
class Meta:
ordering = ['-created_at']
indexes = [models.Index(fields=['title', 'published'])]
def __str__(self):
return self.title
@property
def summary(self):
return self.content[:200] + "..."
class Tag(models.Model):
name = models.SlugField(unique=True)
def __str__(self):
return self.name
Advanced Querysets
from django.db.models import Count, Q, Avg, Prefetch
# Basic queries
articles = Article.objects.filter(published=True)
recent = Article.objects.order_by('-created_at')[:10]
# Complex filtering
popular = Article.objects.filter(
Q(published=True) & Q(title__icontains='python')
).exclude(author__username='test')
# Aggregation
stats = Article.objects.aggregate(
total=Count('id'),
avg_length=Avg('content__len')
)
# Prefetch related (avoid N+1)
articles_with_tags = Article.objects.prefetch_related(
Prefetch('tags', queryset=Tag.objects.only('name'))
).select_related('author')
# Bulk operations
Article.objects.filter(published=False).update(published=True)
Article.objects.bulk_create([
Article(title=f"Article {i}", content="...") for i in range(100)
])
View Integration
from django.views.generic import ListView, DetailView
class ArticleListView(ListView):
model = Article
paginate_by = 20
def get_queryset(self):
return super().get_queryset().filter(
published=True
).select_related('author').prefetch_related('tags')
Follow me for more Django tips! 🐍
Follow for more Python content!
💡 Related: **Content Creator Ultimate Bundle (Save 33%)* — $29.99*
Top comments (0)