Vue d'ensemble

Django 1.10, publié le 1er août 2016, introduit la recherche plein texte pour PostgreSQL et refond le système de middlewares. Le nouveau réglage MIDDLEWARE remplace MIDDLEWARE_CLASSES avec une architecture simplifiée. La recherche plein texte offre des capacités avancées de recherche directement intégrées dans l'ORM.

Fonctionnalités principales

Recherche plein texte PostgreSQL

Le module django.contrib.postgres.search fournit des outils de recherche plein texte natifs pour PostgreSQL. On dispose de SearchVector, SearchQuery, SearchRank et de la recherche trigramme pour des recherches approximatives.

python
from django.contrib.postgres.search import (
    SearchVector, SearchQuery, SearchRank,
)

# Recherche simple sur plusieurs champs
resultats = Article.objects.annotate(
    recherche=SearchVector('titre', 'contenu'),
).filter(recherche='django migrations')

# Recherche avec classement par pertinence
vecteur = SearchVector('titre', weight='A') + SearchVector('contenu', weight='B')
requete = SearchQuery('performance optimisation')

resultats_classes = (
    Article.objects
    .annotate(rang=SearchRank(vecteur, requete))
    .filter(rang__gte=0.1)
    .order_by('-rang')
)

Nouveau système de middleware

Le réglage MIDDLEWARE remplace MIDDLEWARE_CLASSES. Les nouveaux middlewares sont des callables simples au lieu de classes avec des méthodes spécifiques, ce qui rend leur écriture plus intuitive.

python
import time

# Middleware sous forme de fonction
def middleware_temps_reponse(get_response):
    """Mesure le temps de traitement de chaque requête."""
    def middleware(request):
        debut = time.time()
        response = get_response(request)
        duree = time.time() - debut
        response['X-Temps-Reponse'] = f'{duree:.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',
    'monprojet.middleware.middleware_temps_reponse',
]

Sources