Одна задача по ID
Часть раздела JSON API путешествия по Django на Coddy. Урок 3 из 19.
Программа, которая читала список, теперь хочет получить одну задачу по её собственному URL: /api/tasks/1/. Маршрут получает id через <int:pk>, как и страницы с подробной информацией, а вспомогательная функция из стартового проекта task_to_dict(task) преобразует задачу в словарь.
Новое здесь — обработка отсутствующей задачи. get_object_or_404 возвращает HTML-страницу 404 от Django, которую программа не может прочитать. API возвращает ошибки тоже в формате JSON, с правильным кодом состояния — числом, которое показывает, как прошёл запрос: 200 OK, 403 Forbidden, 404 Not Found. JsonResponse принимает его как status:
return JsonResponse({"error": "Staff only"}, status=403)Чтобы выбрать между ошибкой и задачей, поищи строку, не вызывая исключение: filter(pk=...).first() возвращает строку или None, если такой строки нет.
Задание
ЛегкоДобавь эндпоинт для одной задачи:
- Представление
task_detail(request, pk), которое возвращаетtask_to_dict(task)в формате JSON. - Если идентификатор не найден, возвращай
{"error": "Task not found"}со статусом404. - Маршрут
"api/tasks/<int:pk>/"с именемtask_detail.
Нажми Run, затем открой /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