Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
Serializer avec relations imbriquees
Dans toute API un peu serieuse, tes donnees sont liees entre elles. Un article a un auteur. Une commande a des produits. Un commentaire appartient a un post. La question qui se pose quand tu serialises, c'est : comment representer ces liens ?
Tu as deux options classiques. La premiere, c'est d'envoyer juste l'identifiant de la relation. Leger, rapide, mais le frontend doit faire une deuxieme requete pour avoir les details.
{"title": "Mon article", "author_id": 42}
La deuxieme, c'est d'imbriquer les donnees directement. Le frontend a tout d'un coup, mais la reponse est plus volumineuse.
AuthorSerializer avec les champs 'id' et 'name'. Méthode serialize(data) qui extrait ces champs.
PostSerializer avec les champs 'id', 'title', 'content' et 'author'. Il prend un paramètre expand_author dans __init__ (False par défaut). Sa méthode serialize(data) fonctionne ainsi : - Si expand_author est False, le champ author contient juste author['id'] (style PrimaryKey) - Si expand_author est True, le champ author contient le résultat de AuthorSerializer().serialize(author) (style imbrique)
class AuthorSerializer:
fields = ['id', 'name']
def serialize(self, data):
return {f: data[f] for f in self.fields if f in data}
class PostSerializer:
fields = ['id', 'title', 'content', 'author']
def __init__(self, expand_author=False):
self.expand_author = expand_author
def serialize(self, data):
result = {}
for f in self.fields:
if f not in data:
continue
if f == 'author':
if self.expand_author:
result['author'] = AuthorSerializer().serialize(data['author'])
else:
result['author'] = data['author']['id']
else:
result[f] = data[f]
return result