Exercices Django Avancé Serializer avec champs calcules
🎉

Bravo!

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

Serializer avec champs calcules

Dans une API de blog, tu ne vas pas stocker le nombre de commentaires dans l'article lui-meme. Tu vas le calculer a la volee. Pareil pour un resume du contenu ou le nom de l'auteur en majuscules. Ce sont des champs calcules qui n'existent pas dans tes donnees brutes mais que tu veux dans ta reponse API.

Dans DRF, le SerializerMethodField fait exactement ca : tu declares un champ et tu ecris une methode get_<nom_du_champ> qui produit la valeur. On va reproduire ce mecanisme pour comprendre l'introspection Python qui le rend possible.

Tu vas créer une classe ArticleDetailSerializer avec :

fields : la liste des champs normaux ('id', 'title', 'content', 'author')
method_fields : la liste des champs calcules ('comment_count', 'summary', 'author_upper')

get_comment_count(data) : retourne le nombre d'éléments dans data['comments'] (ou 0 si la clé n'existe pas)

get_summary(data) : retourne les 50 premiers caracteres de data['content'] suivis de '...' si le contenu fait plus de 50 caracteres, sinon retourne le contenu complet

get_author_upper(data) : retourne data['author'] en majuscules

serialize(data) : construit le dictionnaire résultat avec les champs normaux ET les champs calcules

Exemple :

s = ArticleDetailSerializer()
article = {'id': 1, 'title': 'Python', 'content': 'Un long texte...', 'author': 'alice', 'comments': [1, 2, 3]}
r = s.serialize(article)
r['comment_count'] vaut 3
r['author_upper'] vaut 'ALICE'

Tests (4/5)

Comment count
s = ArticleDetailSerializer()
r = s.serialize({'id': 1, 'title': 'T', 'content': 'C', 'author': 'a', 'comments': [1, 2, 3]})
assert r['comment_count'] == 3
Comment count sans commentaires
s = ArticleDetailSerializer()
r = s.serialize({'id': 1, 'title': 'T', 'content': 'C', 'author': 'a'})
assert r['comment_count'] == 0
Summary long
s = ArticleDetailSerializer()
long_text = 'A' * 100
r = s.serialize({'id': 1, 'title': 'T', 'content': long_text, 'author': 'a'})
assert r['summary'] == 'A' * 50 + '...' and len(r['summary']) == 53
Summary court
s = ArticleDetailSerializer()
r = s.serialize({'id': 1, 'title': 'T', 'content': 'Court', 'author': 'a'})
assert r['summary'] == 'Court'

+ 0 tests cachés

Indices (3 disponibles)

solution.py