REST Framework の generic ビューを用いると,非常に短いコードでコメント一覧の出力や詳細情報の出力ができました.しかし現時点では新規投稿などはできません.
...\django_comment_api>curl -X POST -d "title=API" -d "body=test" http://127.0.0.1:8000/comments/ ⏎
{"detail":"メソッド \"POST\" は許されていません。"}
...\django_comment_api>
これは,次の通り views.py でどちらも読み取り専用 (read-only) である ListAPIView
と RetrieveAPIView
を継承していたためです.
comments\views.py(抜粋)
class CommentList(generics.ListAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
class CommentDetail(generics.RetrieveAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
これらを read-write や read-write-delete である ListCreateAPIView
と RetrieveUpdateDestroyAPIView
に変更するだけで新規投稿と更新・削除ができるようになります.他にも様々な組み合わせがあるので,詳細はこちらで確認してください.
comments\views.py(抜粋)
class CommentList(generics.ListCreateAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
class CommentDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
実際に新規投稿ができるか curl
コマンドで実験します.一覧の取得では標準の GET リクエストでしたが,新規投稿では POST リクエストを利用するので,-X POST
オプションを追加します.また,投稿内容は -d
オプションによって title
と body
をそれぞれ指定します.このコマンドを実行すると,新たなコメントが投稿され,その結果が出力されました.その後,一覧表示にも含まれていることを確認しています.
...\django_comment_api>curl -X POST -d "title=API" -d "body=test" http://127.0.0.1:8000/comments/ ⏎ {"id":11,"title":"API","body":"test","updated_at":"2023-11-23T15:08:23.900953"} ...\django_comment_api>curl http://127.0.0.1:8000/comments/ ⏎ [{"id":11,"title":"API","body":"test","updated_at":"2023-11-23T15:08:23.900953"},{"id":9,"title":"9個目のコメント","body":"コメントの本文9","updated_at":"2023-11-23T11:20:00"},{"id":10,"title":"10個目のコメント","body":"コメントの本文10","updated_at":"2023-11-23T11:10:00"},{"id":8,"title":"8個目のコメント","body":"コメントの本文8","updated_at":"2023-11-23T11:08:00"},{"id":7,"title":"7個目のコメント","body":"コメントの本文7","updated_at":"2023-11-23T11:07:00"},{"id":6,"title":"6個目のコメント","body":"コメントの本文6","updated_at":"2023-11-23T11:06:00"},{"id":5,"title":"5個目のコメント","body":"コメントの本文5","updated_at":"2023-11-23T11:05:00"},{"id":4,"title":"4個目のコメント","body":"コメントの本文4","updated_at":"2023-11-23T11:04:00"},{"id":3,"title":"<3個目>のコメント","body":"<h1>コメントの本文3</h1>","updated_at":"2023-11-23T11:03:00"},{"id":2,"title":"2個目のコメント","body":"コメントの本文2","updated_at":"2023-11-23T11:02:00"},{"id":1,"title":"最初のコメント","body":"コメントの本文","updated_at":"2023-11-23T11:01:00"}] ...\django_comment_api>
続いて Web ブラウザでも確認すると一覧表示の最下部に投稿フォームが表示されました.これは ListCreateAPIView
を継承したためです.このフォームにタイトルと本文を入力して「POST」ボタンを押すと API を通じて POST リクエストが送信され投稿が完了します.
投稿が完了すると次の画面に移行しました.HTTP のレスポンスステータスコードが 201 番になっていることにも注意してください.
一覧表示に戻ると curl
コマンドと Web ブラウザから投稿した内容を確認できます.
続いて,curl
コマンドでコメントの更新と削除を続けて行います.いずれの場合も URL に ID を含めることに注意してください.また,更新には PUT メソッド,削除には DELETE メソッドを指定します.
...\django_comment_api>curl -X PUT -d "title=API edit" -d "body=edit test" http://127.0.0.1:8000/comments/11/ ⏎ # (1) 更新 {"id":11,"title":"API edit","body":"edit test","updated_at":"2023-11-23T15:13:46.721981"} ...\django_comment_api>curl http://127.0.0.1:8000/comments/11/ ⏎ # (2) 確認 {"id":11,"title":"API edit","body":"edit test","updated_at":"2023-11-23T15:13:46.721981"} ...\django_comment_api>curl -X DELETE http://127.0.0.1:8000/comments/11/ ⏎ # (3) 削除 ...\django_comment_api>curl http://127.0.0.1:8000/comments/11/ ⏎ # (4) 確認 {"detail":"見つかりませんでした。"} ...\django_comment_api>
さらに Web ブラウザからも更新と削除の作業を実験します.まず,ID=12の詳細ページを開きます.すると,最下部には編集・更新のためのフォームと,上部には削除のボタンが現れました.タイトルと本文を編集して「PUT」ボタンを押します.
更新されました.続いて「DELETE」ボタンを押します.
確認画面が表示されたので,「Delete」を押します.
コメントを削除することができました.
一覧表示に戻ると2つのコメントが削除されていることが確認できます.