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
先ほどルーターに登録したURLの一覧が取得できていますが、これは/api/にGETリクエストしたレスポンス結果が表示されています。
次はここに表示されているhttp://localhost:8000/api/tickets/にアクセスしてみましょう。
同じく/api/tickets/にGETでリクエストした結果が表示されています。加えてページ下部には、チケットを新規作成するためのフォームも存在しています。このフォームからPOSTでのリクエストをブラウザから試すことができます。
「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からはGETのほかに、PUTとDELETEでのリクエストが試せるようになっていることがわかります。
バリデーションの追加
ModelSerializerは入力値のバリデートを、モデルの定義に沿って実施します。そのためnameに値を入力しないと、以下のようなエラーが返ってきます。
しかしこのままだと問題があります。終了日が開始日よりも前の時期で登録できてしまうからです。日時の整合性を担保するために、バリデーションを追加しましょう。このようなモデルの定義にはないロジックを元としたバリデーションは、自分でSerializerに実装する必要があります。それでは、TicketSerializerにvalidateメソッドを実装しましょう。
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を使って、このバリデーションが動作しているか確認してみましょう。
開始日を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入門連載記事一覧
-
- Djangoでの環境変数と、Angularを用いたフロントエンドの実装
- Djangoのテストの書き方とCircleCIを活用した継続的インテグレーション
- Django 2.0リリース! 最新のDjangoで作るカンバンボードアプリ ~ モデルの...
- この記事の著者
-
新井 正貴(アライ マサタカ)
東京大学文学部卒業、アライドアーキテクツ株式会社にて勤務。2016年4月、株式会社SQUEEZEに入社。コミュニティ活動として、PyCon JP 2015〜 スタッフ、Pythonもくもく会の主催を行う。趣味はラクロスとPerfume。 Site:http://massa142.github.io/ Twitter:@massa142 Facebook:新井 正貴
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
