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.
class QuerySet:
def __init__(self, data):
self.data = list(data)
def filter(self, **kwargs):
filtered = [
item for item in self.data
if all(item.get(k) == v for k, v in kwargs.items())
]
return QuerySet(filtered)
def search(self, query, fields):
query_lower = query.lower()
results = [
item for item in self.data
if any(query_lower in str(item.get(f, '')).lower() for f in fields)
]
return QuerySet(results)
def all(self):
return list(self.data)
def count(self):
return len(self.data)