Using QuerySet filter()

A snippet showing how to use filter() to query Django models.


# models.py

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=120)
    category = models.CharField(max_length=50)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    in_stock = models.BooleanField(default=True)

    def __str__(self):
        return self.name
  

# views.py

from django.shortcuts import render
from .models import Product

def product_list(request):
    qs = Product.objects.filter(in_stock=True)
    q = request.GET.get('q')
    if q:
        qs = qs.filter(name__icontains=q)
    return render(request, 'products.html', {'products': qs})
  

# views.py (advanced lookups)

from django.db.models import Q
from .models import Product

def search_products(request):
    qs = Product.objects.filter(
        Q(price__gte=10) & Q(price__lte=100),
        category__in=['books', 'games'],
        in_stock=True
    )
    return render(request, 'products.html', {'products': qs})
  

# Django Shell

>>> from shop.models import Product
>>> Product.objects.filter(in_stock=True).count()
>>> Product.objects.filter(name__icontains='pro')
>>> Product.objects.filter(price__gte=50, price__lte=150)
>>> Product.objects.filter(category__in=['books', 'games'])
  
Explanation:
  • filter() returns a new QuerySet with rows matching the given conditions; chain it freely for refinement.
  • Use lookups like field__icontains, field__gte, field__lte, and membership with __in.
  • Combine conditions with Q() for complex OR/AND logic while keeping code readable.
  • QuerySets are lazy; evaluation happens on iteration, slicing, or when forcing results in templates.
  • Category Models & ORM
  • Total Views 470
  • Last Modified 02 December, 2025
  • Tags #queryset #filter #orm #models
Previous snippet
Custom Model Manager
Never miss a story on Django.wiki

Subscribe for fresh tutorials, snippets, and updates.

By subscribing you agree to our Privacy Policy.