Representational State Transfer
Create, Retrieve, Update, Destroy
from django.db import models
from django.contrib.auth.models import User
class Stuff(models.Model):
name = models.TextField()
class Things(models.Model):
name = models.TextField()
user = models.ForeignKey(User, related_name="things_set")
stuff_set = models.ManyToManyField(Stuff)
Models are unchanged, so you can add a REST interface to an existing project easily
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'example.main'
)
REST_FRAMEWORK = {
}
'rest_framework'
to your installed apps.REST_FRAMEWORK
allows setting defaults, etc.'rest_framework.authtoken'
from example.main.models import *
from rest_framework import serializers
import django.db.models
class StuffSerializer(serializers.ModelSerializer):
class Meta:
model = Stuff
fields = ('id', 'name', 'things_set')
class ThingsSerializer(serializers.ModelSerializer):
class Meta:
model = Things
fields = ('id', 'name', 'user', 'stuff_set')
from rest_framework import viewsets
from example.main.models import *
from example.main.serializers import *
class ThingsViewSet(viewsets.ModelViewSet):
model = Things
serializer_class = ThingsSerializer
def get_queryset(self):
return self.request.user.things_set.all()
class StuffViewSet(viewsets.ModelViewSet):
model = Stuff
serializer_class = StuffSerializer
ViewSets bind together the CRUD operations for a resource
GET, POST, PUT, PATCH, DELETE, OPTIONS
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
from rest_framework import routers
from example.main import views
api_router = routers.DefaultRouter()
api_router.register(r'things', views.ThingsViewSet)
api_router.register(r'stuff', views.StuffViewSet)
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^api/', include(api_router.urls)),
)
Router collects the ViewSets into a neat API
List ViewSets
List & Create Resources
View & Delete Resources
Update Resources
Classes are easy to inherit from and extend
class CommaSeparatedIntegerSerializerField(serializers.CharField):
"""This just makes the representation of a CommaSeparatedIntegerField a bit
more JSON friendly by splitting it out and putting it back together"""
def to_native(self, value):
if not value: return []
return [ int(v) for v in value.split(',') ]
def from_native(self, value):
if value is None: return None
return ','.join([str(v) for v in value])
class UserViewSet(viewsets.ModelViewSet):
model = User
serializer_class = UserSerializer
def get_queryset(self):
return User.objects.filter(id=self.request.user.id).prefetch_related('things_set')
filter_fields
are ignored.prefetch_related()
many=True, required=False, allow_add_remove=True
?