Menu
CoddyTech

IDで指定する1つのタスク

CoddyのDjangoジャーニー「JSON API」セクションの一部。レッスン 3/19。

一覧を読み取るプログラムが、今度は独自のURL /api/tasks/1/ で1件のタスクを要求しています。ルートは詳細ページと同じように <int:pk> でIDを受け取り、スターターに用意されたヘルパー task_to_dict(task) がタスクを辞書に変換します。

新しい点は、タスクが見つからない場合です。get_object_or_404 はDjangoのHTML 404ページを返しますが、プログラムはそれを読み取れません。APIはエラーもJSONで返し、適切なステータスコードを付けます。これはリクエストの結果を示す番号です。200 OK、403 Forbidden、404 Not Found。JsonResponseでは status として指定します。

return JsonResponse({"error": "Staff only"}, status=403)

エラーとタスクのどちらを返すか選ぶには、例外を発生させずに行を検索します。filter(pk=...).first() は行があればそれを返し、なければ None を返します。

challenge icon

チャレンジ

簡単

1 件のタスクのエンドポイントを追加します。

  • JSON として task_to_dict(task) を返すビュー task_detail(request, pk)。
  • id が見つからない場合は、ステータス 404 とともに {"error": "Task not found"} を返します。
  • task_detail という名前のルート "api/tasks/<int:pk>/"。

「実行」を押してから、/api/tasks/1/ と /api/tasks/99/ を開きます。

自分で試してみよう

from django.http import JsonResponse
from django.shortcuts import render

from .models import Task


def task_to_dict(task):
    return {
        "id": task.id,
        "title": task.title,
        "done": task.done,
        "priority": task.priority,
    }


def home(request):
    return render(request, "tasks/home.html", {"tasks": Task.objects.all()})


def stats(request):
    data = {
        "total": Task.objects.count(),
        "done": Task.objects.filter(done=True).count(),
    }
    return JsonResponse(data)


def task_list(request):
    tasks = Task.objects.values("id", "title", "done", "priority")
    return JsonResponse(list(tasks), safe=False)
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

JSON APIのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド