DEV Community

qing
qing

Posted on

Deep Dive: Django Models and Querysets for Python Developers

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
Enter fullscreen mode Exit fullscreen mode

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)
])
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

Follow me for more Django tips! 🐍

Follow for more Python content!


💡 Related: **Content Creator Ultimate Bundle (Save 33%)* — $29.99*

Top comments (0)