Overview
Django 1.10, released on August 1, 2016, introduces full text search for PostgreSQL and overhauls the middleware system. The new MIDDLEWARE setting replaces MIDDLEWARE_CLASSES with a simplified architecture. Full text search provides advanced search capabilities directly integrated into the ORM.
Key Features
PostgreSQL full text search
The django.contrib.postgres.search module provides native full text search tools for PostgreSQL. It offers SearchVector, SearchQuery, SearchRank, and trigram search for approximate matching.
from django.contrib.postgres.search import (
SearchVector, SearchQuery, SearchRank,
)
# Simple search across multiple fields
results = Article.objects.annotate(
search=SearchVector('title', 'content'),
).filter(search='django migrations')
# Search with relevance ranking
vector = SearchVector('title', weight='A') + SearchVector('content', weight='B')
query = SearchQuery('performance optimization')
ranked_results = (
Article.objects
.annotate(rank=SearchRank(vector, query))
.filter(rank__gte=0.1)
.order_by('-rank')
)
New middleware system
The MIDDLEWARE setting replaces MIDDLEWARE_CLASSES. The new middlewares are simple callables instead of classes with specific methods, making them more intuitive to write.
import time
# Middleware as a function
def response_time_middleware(get_response):
"""Measure the processing time of each request."""
def middleware(request):
start = time.time()
response = get_response(request)
duration = time.time() - start
response['X-Response-Time'] = f'{duration:.3f}s'
return response
return middleware
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'myproject.middleware.response_time_middleware',
]
