Exercices Django Avancé Filtrage et recherche
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Filtrage et recherche

Ouvre n'importe quelle appli web serieuse : tu as un champ de recherche et des filtres. Sur un e-commerce, tu filtres par categorie et tu cherches par nom de produit. Sur un CMS, tu filtres par auteur et tu cherches dans le titre. C'est un besoin universel.

DRF offre deux mecanismes pour ca. Le filtrage exact retrouve les objets qui matchent des criteres precis (tous les articles de 'alice'). La recherche textuelle retrouve les objets qui contiennent un mot dans un ou plusieurs champs (tous les articles qui parlent de 'python').

Tu vas creer une classe QuerySet qui simule ces deux mecanismes :

__init__(data) : prend une liste de dictionnaires (les données brutes)

filter(**kwargs) : retourne un nouveau QuerySet contenant seulement les éléments qui matchent TOUS les criteres (egalite exacte). On peut chainer les appels : qs.filter(author='alice').filter(status='published')

search(query, fields) : retourne un nouveau QuerySet contenant les éléments dont AU MOINS UN des champs specifies contient query (recherche insensible a la casse). fields est une liste de noms de champs.

all() : retourne la liste des éléments actuels

count() : retourne le nombre d'éléments

Exemple :

data = [
{'id': 1, 'title': 'Python basics', 'author': 'alice'},
{'id': 2, 'title': 'Django REST', 'author': 'bob'},
{'id': 3, 'title': 'Advanced Python', 'author': 'alice'},
]
qs = QuerySet(data)
qs.filter(author='alice').count() renvoie 2
qs.search('python', ['title']).count() renvoie 2

Tests (4/5)

Filter simple
data = [{'id': 1, 'author': 'alice'}, {'id': 2, 'author': 'bob'}, {'id': 3, 'author': 'alice'}]
qs = QuerySet(data)
assert qs.filter(author='alice').count() == 2
Filter chaine
data = [{'id': 1, 'author': 'alice', 'status': 'published'}, {'id': 2, 'author': 'alice', 'status': 'draft'}]
qs = QuerySet(data)
assert qs.filter(author='alice').filter(status='published').count() == 1
Search textuelle
data = [{'id': 1, 'title': 'Python basics'}, {'id': 2, 'title': 'Django REST'}, {'id': 3, 'title': 'Advanced Python'}]
qs = QuerySet(data)
assert qs.search('python', ['title']).count() == 2
Search insensible a la casse
data = [{'id': 1, 'title': 'PYTHON'}, {'id': 2, 'title': 'python'}, {'id': 3, 'title': 'Java'}]
qs = QuerySet(data)
assert qs.search('Python', ['title']).count() == 2

+ 0 tests cachés

Indices (3 disponibles)

solution.py