SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

モダンDjango入門

Django 2.0リリース! 最新のDjangoで作るカンバンボードアプリ ~ モデルの定義とDjango REST frameworkの実装

モダンDjango入門 第2回

Django REST framework(2)

Browsable APIによる確認

 Django REST frameworkには、実装したAPIをブラウザから閲覧・操作ができる機能が備わっています。GETでのリソース取得だけでなくPOST、PUT、DELETEでのリソースの操作もブラウザからできるので、手軽にテスト・確認をしたいときにBrowsable APIは役立ちます。

 開発サーバを立ち上げて、http://localhost:8000/api/にアクセスしてください。

(env) $ python manage.py runserver
Browsable API ルート
Browsable API ルート

 先ほどルーターに登録したURLの一覧が取得できていますが、これは/api/にGETリクエストしたレスポンス結果が表示されています。

 次はここに表示されているhttp://localhost:8000/api/tickets/にアクセスしてみましょう。

Browsable API チケット一覧
Browsable API チケット一覧

 同じく/api/tickets/にGETでリクエストした結果が表示されています。加えてページ下部には、チケットを新規作成するためのフォームも存在しています。このフォームからPOSTでのリクエストをブラウザから試すことができます。

Browsable API チケットフォーム
Browsable API チケットフォーム

 「POST」ボタンをクリックしてリクエストが成功すると、画面の表示が以下のように切り替わります。

POST /api/tickets/

HTTP 201 Created
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2,
    "assignee": null,
    "status_display": "Done",
    "name": "ticket 2",
    "description": "This is the second ticket.",
    "status": 3,
    "start": "2018-02-01",
    "end": "2018-02-28"
}

 HTTPのステータスコードとして「201 Created」が返ってきたので、新たにリソースが作成できたことが確認できます。作成したこのチケットに対しても、APIを通してアクセスしてみましょう。

 http://localhost:8000/api/tickets/2/にアクセスします。

Browsable API チケット詳細
Browsable API チケット詳細

 このBrowsable APIからはGETのほかに、PUTとDELETEでのリクエストが試せるようになっていることがわかります。

バリデーションの追加

 ModelSerializerは入力値のバリデートを、モデルの定義に沿って実施します。そのためnameに値を入力しないと、以下のようなエラーが返ってきます。

Browsable API バリデーション
Browsable API バリデーション

 しかしこのままだと問題があります。終了日が開始日よりも前の時期で登録できてしまうからです。日時の整合性を担保するために、バリデーションを追加しましょう。このようなモデルの定義にはないロジックを元としたバリデーションは、自分でSerializerに実装する必要があります。それでは、TicketSerializervalidateメソッドを実装しましょう。

from django.contrib.auth import get_user_model
from rest_framework import serializers

from .models import Ticket

User = get_user_model()


class TicketSerializer(serializers.ModelSerializer):
    assignee = serializers.SlugRelatedField(
        slug_field=User.USERNAME_FIELD, queryset=User.objects.all(), allow_null=True)
    status_display = serializers.SerializerMethodField()

    class Meta:
        model = Ticket
        exclude = ('created', 'modified')

    def get_status_display(self, obj):
        return obj.get_status_display()

    def validate(self, data):
        start = data['start']
        end = data['end']

        if start and end and start > end:
            raise serializers.ValidationError('終了日は開始日以降に設定してください')

        return data

 開始日と終了日がどちらも設定されている場合には、ちゃんと終了日が開始日以降になっているかどうかのチェックを行うバリデーションを追加しました。Browsable APIを使って、このバリデーションが動作しているか確認してみましょう。

Browsable API カスタムバリデーション
Browsable API カスタムバリデーション

 開始日を2018/03/01、終了日を2018/02/28としようとすると、先ほどのバリデーションに引っかかりエラーを返しているのが確認できます。

 validateメソッドには、このような複数のフィールドの組み合わせが必要となるバリデーションを実装します。特定のフィールドのみに対するバリデーションを追加したい場合には、validate_<field_name>メソッドで対応できます。たとえば開始日には今日以前の日付を設定できないようにするという場合には、以下のようにvalidate_startメソッドを実装することで実現できます。

    def validate_start(self, value):
        if value and value < datetime.date.today():
            raise serializers.ValidationError('開始日には今日以降を設定してください')
        return value

 チケットに関するRESTful APIが最低限実装できたところで、今回はここまでとしておきます。ここまで解説したソースコードは以下から見ることができます。

終わりに

 今回は、Django 2.0、モデルの定義、Django REST frameworkの導入について紹介してきました。

 次回は引き続きDjango REST frameworkの解説を中心に、フロントエンドの開発も合わせて進めていきます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
モダンDjango入門連載記事一覧

もっと読む

この記事の著者

新井 正貴(アライ マサタカ)

 東京大学文学部卒業、アライドアーキテクツ株式会社にて勤務。2016年4月、株式会社SQUEEZEに入社。コミュニティ活動として、PyCon JP 2015〜 スタッフ、Pythonもくもく会の主催を行う。趣味はラクロスとPerfume。 Site:http://massa142.github.io/ Twitter:@massa142 Facebook:新井 正貴

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10722 2018/03/15 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー