Django REST frameworkとbpmappersを組み合わせて使う

DjangoREST APIを簡単につくるためのライブラリは、django-tastypie以外にDjango REST framework(以下rest_framework)というのもある。
Django REST framework
これとbpmappersを組み合わせて使う方法を調べたのでまとめる。
rest_frameworkモジュールのソースコードを読んだところ、rest_framework.serializersはbpmappersとほぼ同等の処理を行っている。
そのため、bpmappersを使わずにrest_framework.serializersですべて実装してしまっても良いと思う。
今回はあえてそれをしない。

試したコード

models.py
from django.db import models

class Item(models.Model):
    name = models.CharField(max_length=20)
    price = models.PositiveIntegerField()
myapp/mappers.py

idをitem_idに、nameをitem_nameにマッピングする。

from bpmappers import Mapper, RawField


class ItemMapper(Mapper):
    item_id = RawField('id')
    item_name = RawField('name')
myapp/views.py

views.pyではrest_frameworkのapi_viewデコレータとResponseクラスを使う。
引数にシリアライズした辞書を渡せば良いので、ここでas_dictの結果を指定する。

# coding: utf-8
from rest_framework.decorators import api_view
from rest_framework.response import Response
from myapp.models import Item
from myapp.mappers import ItemMapper


@api_view(['GET'])
def item_list(request):
    items = Item.objects.all()
    return Response(ItemMapper(item).as_dict() for item in items)
myproject/urls.py
from django.conf.urls import patterns, include, url


urlpatterns = patterns('',
    url(r'^items/', 'myapp.views.item_list'),
)

実行結果

syncdbを実行して、適当にデータをshellで作って、runserverを起動。
Chromehttp://localhost:8000/items/ にアクセスするとこんな感じに表示される。 "?format=json" を指定するとJSON形式で取得できる。

django-tastypieと比べると、Django REST frameworkのほうが構造はシンプルに見える。使いやすそう。