Exercices Django Avancé ListAPIView simulee avec filtrage
🎉

Bravo!

Débutant 🧠 Fondamentaux 10 XP 0 personnes ont réussi

ListAPIView simulee avec filtrage

Dans une application reelle, ton frontend a besoin de recuperer des listes d'objets. La page d'accueil d'un blog affiche les derniers articles. Un dashboard affiche les commandes du jour. Et souvent, l'utilisateur veut filtrer : seulement les articles de tel auteur, seulement les commandes en cours.

Dans DRF, une ListAPIView fait exactement ca. Derriere la magie, c'est juste du filtrage sur une liste. On va reproduire ce mecanisme a la main pour bien comprendre comment ca fonctionne.

Ecris une fonction list_articles(articles, filters=None) qui :

- Prend une liste de dictionnaires (les articles) et un dictionnaire de filtres optionnel
- Si filters est None ou vide, retourne tous les articles
- Si filters contient des paires cle/valeur, ne retourne que les articles qui matchent TOUS les filtres
- Le filtre fonctionne par egalite exacte : filters={'author': 'Alice'} ne garde que les articles dont l'auteur est 'Alice'
- Retourne la liste filtree sous forme de dictionnaire : {'count': nombre, 'results': liste}

Exemple :

articles = [
{'id': 1, 'title': 'Python', 'author': 'Alice'},
{'id': 2, 'title': 'Django', 'author': 'Bob'},
{'id': 3, 'title': 'Flask', 'author': 'Alice'},
]
list_articles(articles, {'author': 'Alice'})
renvoie {'count': 2, 'results': [{'id': 1, ...}, {'id': 3, ...}]}

Tests (4/5)

Sans filtre
articles = [{'id': 1, 'title': 'A', 'author': 'X'}, {'id': 2, 'title': 'B', 'author': 'Y'}]
r = list_articles(articles)
assert r['count'] == 2 and len(r['results']) == 2
Filtre par auteur
articles = [{'id': 1, 'title': 'A', 'author': 'Alice'}, {'id': 2, 'title': 'B', 'author': 'Bob'}, {'id': 3, 'title': 'C', 'author': 'Alice'}]
r = list_articles(articles, {'author': 'Alice'})
assert r['count'] == 2
Filtres multiples
articles = [{'id': 1, 'title': 'A', 'author': 'Alice', 'status': 'published'}, {'id': 2, 'title': 'B', 'author': 'Alice', 'status': 'draft'}]
r = list_articles(articles, {'author': 'Alice', 'status': 'published'})
assert r['count'] == 1 and r['results'][0]['id'] == 1
Aucun résultat
articles = [{'id': 1, 'author': 'Alice'}]
r = list_articles(articles, {'author': 'Nobody'})
assert r['count'] == 0 and r['results'] == []

+ 0 tests cachés

Indices (3 disponibles)

solution.py