Menu
CoddyTech

将列表表示为 JSON

本课属于 Coddy Django 学习旅程的“JSON API”单元。第 2 课,共 19 课。

程序需要一个列出所有任务的 URL。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 中,添加一个视图 task_list,使其返回一个 JSON 列表,每个任务对应一个对象,对象包含 id、title、done 和 priority 这些键。
  2. 在 tasks/urls.py 中,添加名为 task_list 的路由 "api/tasks/"。

点击“运行”:预览会打开 /api/tasks/,并列出 Buy milk、Write the report 和 Call the bank。

亲手试试

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 在线编辑器