grimboite/old/rest-framework.md

3.0 KiB

Title: Django Rest Framework Status: draft Date: 2015-07-01

Django Rest Framework est un framework spécifique à Django et permettant de développer rapidement une interface REST sur base d'une application existante (ou en cours de développement). Dans le même genre, il existe également TastyPie (que je n'ai jamais essayé).

TL;DR

La première étape est de définir les classes qui composent le modèle. Ceci est fait grâce à l'ORM de Django, de manière tout à fait classique. Une fois que ce sera fait, on pourra:

  1. Implémenter un serializer afin de modéliser la manière dont les instances de classe seront sérialisées, quels sont les champs qui seront accessibles au travers de l'API, quels sont les champs à ajouter, comment gérer les relations, ...
  2. Définir le viewset, c'est-à-dire la manière dont l'API doit se comporter vis-à-vis des différents verbes HTTP.
  3. Et finalement lier les viewsets au travers du fichier urls.py, pour qu'ils puissent être interrogés.

En détails

J'ai créé un projet Django que j'ai nommé asap, grâce à la commande django-admin startproject asap (après avoir créé un [environnement virtuel]({filename}/conf/2013-08-03 virtualenv.md), tout ça tout ça). On crée ensuite une application potatoe avec la commande python manage.py startapp potatoe. Cela donne la structure suivante:

asap/
	settings.py
	urls.py
	...
potatoe/
	admin.py
	models.py
	tests.py
	views.py

Dans le fichier potatoe/models.py, on définit les classes afin que l'ORM prenne la main sur les migrations et la base de données. Pour l'exemple, on peut créer une classe pour définir les différents projets, une classe pour les contextes et une classe pour les tâches.

models.py

from django.db import models
from django.contrib.auth.models import User

class Project(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Context(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Task(models.Model):
    PRIORITIES = (
        ('A', 'Highest'),
        ('B', 'Medium'),
        ('C', 'Low')
    )
    
    description = models.CharField(max_length=2000)
    projects = models.ManyToManyField('Project')
    contexts = models.ManyToManyField('Context')
    priority = models.CharField(max_length=1, choices=PRIORITIES, null=True)
    assignee = models.ForeignKey(User)
    
    def __str__(self):
        return self.description

serializers.py


urls.py