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の解説を中心に、フロントエンドの開発も合わせて進めていきます。
