Exercices Django Avancé ViewSet simule
🎉

Bravo!

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

ViewSet simule

Jusqu'ici tu as ecrit des fonctions separees pour chaque operation. En vrai projet DRF, tu regrouperais tout ca dans un ViewSet : une seule classe avec des methodes list, create, retrieve, update, destroy. C'est beaucoup plus organise et ca evite la duplication.

Le ViewSet recoit une requete et, selon la methode HTTP et la presence d'un identifiant, il dispatche vers la bonne methode :

GET sans id -> list() (liste tous les objets)
POST sans id -> create() (crée un objet)
GET avec id -> retrieve() (detail d'un objet)
PUT avec id -> update() (modifie un objet)
DELETE avec id -> destroy() (supprime un objet)

Tu vas créer une classe ArticleViewSet qui :

Stocke les articles dans self.db (dictionnaire id vers article) et self.next_id

A une méthode dispatch(method, data=None, pk=None) qui route vers la bonne méthode selon la méthode HTTP et la presence de pk (primary key, l'identifiant).

Si la méthode n'est pas reconnue, retourne {'status': 405, 'error': 'Méthode non autorisee'}.

Si pk est donne mais l'objet n'existe pas (pour retrieve, update, destroy), retourne {'status': 404, 'error': 'Non trouve'}.

Exemple :

vs = ArticleViewSet()
vs.dispatch('POST', data={'title': 'Hello'})
renvoie {'status': 201, 'data': {'id': 1, 'title': 'Hello'}}

vs.dispatch('GET')
renvoie {'status': 200, 'data': [{'id': 1, 'title': 'Hello'}]}

vs.dispatch('GET', pk=1)
renvoie {'status': 200, 'data': {'id': 1, 'title': 'Hello'}}

Tests (4/5)

Create et list
vs = ArticleViewSet()
r = vs.dispatch('POST', data={'title': 'Hello'})
assert r['status'] == 201 and r['data']['id'] == 1
r2 = vs.dispatch('GET')
assert r2['status'] == 200 and len(r2['data']) == 1
Retrieve existant
vs = ArticleViewSet()
vs.dispatch('POST', data={'title': 'Test'})
r = vs.dispatch('GET', pk=1)
assert r['status'] == 200 and r['data']['title'] == 'Test'
Retrieve inexistant
vs = ArticleViewSet()
r = vs.dispatch('GET', pk=999)
assert r['status'] == 404
Update et delete
vs = ArticleViewSet()
vs.dispatch('POST', data={'title': 'Old'})
r = vs.dispatch('PUT', data={'title': 'New'}, pk=1)
assert r['data']['title'] == 'New'
r2 = vs.dispatch('DELETE', pk=1)
assert r2['status'] == 204

+ 0 tests cachés

Indices (3 disponibles)

solution.py