Menu
CoddyTech

JSONとしてのリスト

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

プログラムには、すべてのタスクを一覧表示するURLが1つ必要です。TaskはそのままJSONに入れられないため、まず各行を辞書にする必要があります。QuerySetのメソッドvalues()を使うと、指定したキーだけを含む辞書にできます。書店のBookモデルでは、次のようになります。

>>> Book.objects.values("title", "year")
<QuerySet [{'title': 'Dune', 'year': 1965}, {'title': 'Emma', 'year': 1815}]>

これはまだQuerySetなので、JSONの書き込み処理では扱えません。list()はクエリを実行し、通常のリストを返します。

最後に、JsonResponseが受け取れるのは辞書だけです。ただし、safe=Falseを渡す場合は例外です。これを指定せずにリストを渡すと、TypeErrorが発生します。

return JsonResponse(["red", "green", "blue"], safe=False)
challenge icon

チャレンジ

簡単

すべてのタスクをJSONとして一覧表示します。

  1. tasks/views.pyに、タスクごとに1つのオブジェクトを含むJSONリストを返すビューtask_listを追加します。各オブジェクトのキーはid、title、done、priorityです。
  2. tasks/urls.pyに、"api/tasks/"というルートを追加し、名前をtask_listにします。

「実行」を押すと、プレビューで/api/tasks/が開き、「牛乳を買う」「レポートを書く」「銀行に電話する」が一覧表示されます。

自分で試してみよう

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

from .models import Task


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)

JSON APIのすべてのレッスン

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