Python Django 入門トップページ


Django REST Framework による API 開発

  1. API とプロジェクトの概要
  2. Django REST Frameworkのインストール
  3. プロジェクトの作成
  4. 基本設定
  5. アプリケーションの作成と登録
  6. モデルの作成とマイグレーション
  7. テストデータの設定
  8. コメント一覧を出力する API
  9. コメント詳細情報を出力する API
  10. 新規投稿と更新・削除の API
  11. ページネーション
  12. 入力内容の検証(バリデーション)
  13. テストの自動化
  14. Shell でのユーザ登録
  15. Fixtures でのユーザ登録
  16. ユーザ認証を必須にする
  17. コメントにオーナ情報を追加
  18. 権限の設定:Case #1
  19. 権限の設定:Case #2
  20. Python から API への接続
  21. React アプリケーションからの API 接続と CORS エラーの回避

Django REST Framework による API 開発

入力内容の検証(バリデーション)

コメントの投稿や更新ができるようになりましたが,多くの場合は投稿された内容を検証する必要があるでしょう.ここでは確認作業を行いやすいように,タイトルは上限10文字,本文は上限15文字としてみます.入力内容を検証するには serializers.py に validation のコードを追加します.具体的には validate_フィールド名 というルールで関数を作成し,その関数の中でバリデーションのルールを指定します.なお,Validation のスタイルはいくつかありますが,今回は Field-level validation を利用しています.

comments\serializers.pyfrom .models import Comment
from rest_framework import serializers

class CommentSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Comment
        fields = ['id', 'title', 'body', 'updated_at']

    def validate_title(self, value):
        if len(value) > 10:
            raise serializers.ValidationError("タイトルの最大文字数は10文字です")
        return value

    def validate_body(self, value):
        if len(value) > 15:
            raise serializers.ValidationError("本文の最大文字数は15文字です")
        return value

実際にバリデーションが正しく行われているか検証します.まず,(1) でタイトルには11文字,本文には16文字を指定して投稿します.その後 (2) では10文字と15文字で投稿します.(3) で投稿できた結果を確認しています.

...\django_comment_api>curl -X POST -d "title=01234567890" -d "body=0123456789012345" http://127.0.0.1:8000/comments/ ⏎ # (1) エラー
{"title":["タイトルの最大文字数は10文字です"],"body":["本文の最大文字数は15文字です"]}
...\django_comment_api>curl -X POST -d "title=0123456789" -d "body=012345678901234" http://127.0.0.1:8000/comments/ ⏎ # (2) 成功
{"id":13,"title":"0123456789","body":"012345678901234","updated_at":"2023-11-23T15:24:38.905335"}
...\django_comment_api>curl http://127.0.0.1:8000/comments/13/ ⏎ # (3) 確認
{"id":13,"title":"0123456789","body":"012345678901234","updated_at":"2023-11-23T15:24:38.905335"}
...\django_comment_api>

目次に戻る