Django REST frameworkのチュートリアルを試す「Tutorial 1: Serialization」


Django REST frameworkのチュートリアル「Tutorial 1: Serialization」を試す。

環境

Yosemite 10.10.3
python 3.4.3
環境構築は以下を参照。
iMac(Yosemite)にHomebrew(0.9.5)をインストール | kazsoga(曽我一弘)ブログ
iMac(Yosemite)にGitをHomebrewでインストール | kazsoga(曽我一弘)ブログ
iMac(Yosemite)にpyenvをHomebrewでインストールする | kazsoga(曽我一弘)ブログ

virtualenvの設定

いきなり、
1 – Serialization – Django REST framework

virtualenv env
でつまずく。
-bash: virtualenv: command not found
だそうです。

で、pyenv-virtualenvをインストール。
$ brew install pyenv-virtualenv

で改めて試してみたら、いけたみたい。
$ virtualenv vevrest
Using base prefix '/Users/sogakazuhiro/.pyenv/versions/3.4.3'
New python executable in vevrest/bin/python3.4
Not overwriting existing python script vevrest/bin/python (you must use vevrest/bin/python3.4)
Installing setuptools, pip, wheel...done.

うまくいきました。
$ source vevrest/bin/activate
(vevrest)$

Djangoのインストール

pip install django
pip install djangorestframework
pip install pygments

問題なく終了。

Getting startedのところから

cd ~
とあったけれど、今回は同じディレクトリ内で完結させたいので省く。

django-admin.py startproject tutorial
cd tutorial
python manage.py startapp snippets
cd tutorial
vi settings.py
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', # 追加
    'snippets', # 追加
)


で、

vi urls.py 
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('snippets.urls')), # 追加
]

次に、snippetsアプリのmodels.pyを追加。

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())


class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Meta:
        ordering = ('created',)



python manage.py makemigrations snippets
python manage.py migrate

も無事終了。

Working with Serializers

python manage.py shell
からはshellに打ち込んでいく。

具体的には、
>>>
に、
from snippets.models import Snippet
を入力していく。

薄い灰色の部分は出力結果。

Using ModelSerializersで、models.pyを編集するのだけれど、

from django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
        pk = serializers.IntegerField(read_only=True)
        title = serializers.CharField(required=False, allow_blank=True, max_length=100)
        code = serializers.CharField(style={'base_template': 'textarea.html'})
        linenos = serializers.BooleanField(required=False)
        language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
        style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return Snippet.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """
        Update and return an existing `Snippet` instance, given the validated data.
        """
        instance.title = validated_data.get('title', instance.title)
        instance.code = validated_data.get('code', instance.code)
        instance.linenos = validated_data.get('linenos', instance.linenos)
        instance.language = validated_data.get('language', instance.language)
        instance.style = validated_data.get('style', instance.style)
        instance.save()
        return instance


としたらうまくいきました。

出力が多いので、驚きましたが、正常です。

次のviews.pyとurls.pyの設定をして、runserverして、以下にアクセスするとデータが見えた。

http://127.0.0.1:8000/snippets/
スクリーンショット 2015-06-11 23.42.01

http://127.0.0.1:8000/snippets/2/
スクリーンショット 2015-06-11 23.42.15

追記

http http://127.0.0.1:8000/snippets/
以下の部分について、
コマンドラインで、上記を叩くと表示される。