python 23 lines · 1 tab

Django select_related and prefetch_related for N+1 query optimization

Priya Sharma Jan 2026
1 tab
from django.db.models import Prefetch
from django.views.generic import ListView
from .models import Post, Comment


class PostListView(ListView):
    model = Post
    template_name = 'blog/post_list.html'
    context_object_name = 'posts'

    def get_queryset(self):
        # Optimize author (ForeignKey) and tags (ManyToMany)
        # Also prefetch recent comments with custom queryset
        recent_comments = Comment.objects.filter(
            approved=True
        ).select_related('author').order_by('-created_at')[:5]

        return Post.objects.select_related(
            'author'
        ).prefetch_related(
            'tags',
            Prefetch('comments', queryset=recent_comments)
        ).filter(published=True)
1 file · python Explain with highlit

The N+1 query problem is Django's most common performance trap. I use select_related for foreign key and one-to-one relationships (performs SQL JOIN), and prefetch_related for many-to-many and reverse foreign keys (separate queries with Python join). The Django Debug Toolbar helps identify these issues early. For complex prefetches, I use Prefetch objects to customize the queryset, like adding ordering or filtering. This dramatically reduces query count from hundreds to single digits, making views fast even with large datasets.


Related snips

python
import os
import stat

for root, _dirs, files in os.walk('/etc'):
    for name in files:
        path = os.path.join(root, name)

Python security audit script for exposed risky filesystem state

python auditing host-security
by Kai Nakamura 1 tab
python
class Product(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    cost = models.DecimalField(max_digits=10, decimal_places=2)
    margin = models.DecimalField(max_digits=5, decimal_places=2, blank=True)

Django model signals vs overriding save

django python models
by Priya Sharma 2 tabs
ruby
require "csv"

class PeopleCsvStream
  include Enumerable

  HEADERS = %w[id full_name email signed_up_at plan].freeze

Resilient CSV Export as a Streamed Response

rails performance streaming
by codesnips 3 tabs
ruby
Rails.application.configure do
  config.after_initialize do
    Bullet.enable = true
    Bullet.alert = false
    Bullet.bullet_logger = true
    Bullet.console = true

N+1 query detection with Bullet gem

rails performance activerecord
by Alex Kumar 2 tabs
python
from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [

Django URL namespacing and reverse lookups

django python urls
by Priya Sharma 3 tabs
ruby
# Vulnerable: user input is concatenated directly into SQL.
email = params[:email]
password = params[:password]

sql = "SELECT * FROM users WHERE email = '#{email}' AND password_hash = '#{password}'"
user = ActiveRecord::Base.connection.execute(sql).first

SQL injection prevention with unsafe and safe query patterns

sql-injection owasp database
by Kai Nakamura 3 tabs

Share this code

Here's the card — post it anywhere.

Django select_related and prefetch_related for N+1 query optimization — share card
Link copied