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 を返します。
チャレンジ
簡単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)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
JSON APIのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド