ジャンゴレストフレームワークチュートリアルの ゲット/プット/デルタを エクセプトで作成する


何をやるのか


前々回の記事と前回の記事で、SnippetCountリストの一覧の APIを エクセプトと 視界で ゲット/ポストできるようにした.
今回は 詳細の詳細の APIを CSRF検証を無効化して作成する

スニペット/ URLに 詳細のルーティングを追加


urlpatterns = [
    path('snippets/', views.snippet_list),
    path('snippets/<int:pk>/', views.snippet_detail),
]
スニペット/1や スニペット/99のパスにアクセスした時に見るところを
見解の 詳細に設定する

スニペット/ビューに 詳細を記載


@csrf_exempt
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        snippet.delete()
        return HttpResponse(status=204)
モデルからのオブジェクトの取り出し、
ゲット/プット/削除の JSONレスポンスへの処理
これらを書いている
一つ一つ見ていく

CSRF検証無効化と リクエストと 京大理


@csrf_exempt
def snippet_detail(request, pk):
最初に CSRF検証無視を記載
リクエストと 京大理を受け取る
主キーつまり ID

スニペットモデルからオブジェクトを取得、例外処理


    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)
受け取った 京大理からデータを取り、変数 スニペットに入れる
それがなくて失敗したら、404を返す

ゲット


    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return JsonResponse(serializer.data)
ゲットの時は普通にモデルから取り出したデータを
シリアライズして JSONレスポンスで返す

プット


    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)
プットの時は リクエストの中身を JSONパーサーにかけて
シリアライザにかけて、中身があれば JSONレスポンスで返す.

削除


    elif request.method == 'DELETE':
        snippet.delete()
        return HttpResponse(status=204)
削除の時は単に取ってきたオブジェクトに .delete ()をかけて
レスポンスの 404 を返している
ポストは存在しない.
詳細では既にあるものにアクセスしてるからだ.

まとめ


詳細では
スニペットモデルから渡された id ( pk )のデータをとって
なかった場合は 404を返して
ゲットの場合はシリアライズして JSONで返す
プットの場合は JSONパーサーしてシリアライズに成功すれば保存
失敗すれば 400でエラーを返す
削除の場合は delete ()をかけて 204を返す
これで詳細ページの APIが作れた