Menu
CoddyTech

ID로 조회하는 하나의 작업

Coddy Django 여정의 JSON API 섹션에 포함된 레슨. 19개 중 3번째.

목록을 읽던 프로그램이 이제 자체 URL인 /api/tasks/1/에서 작업 하나를 원합니다. 경로는 세부 정보 페이지에서 그랬던 것처럼 <int:pk>로 id를 받고, 시작 코드에 포함된 도우미 task_to_dict(task)는 작업을 딕셔너리로 변환합니다.

새로운 부분은 작업이 없는 경우입니다. get_object_or_404는 Django의 HTML 404 페이지를 반환하는데, 프로그램은 이를 읽을 수 없습니다. 따라서 API는 적절한 상태 코드, 즉 요청이 어떻게 처리되었는지를 나타내는 숫자와 함께 오류도 JSON으로 보냅니다. 200 정상, 403 접근 금지, 404 찾을 수 없음입니다. JsonResponse에서는 status로 지정합니다.

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

오류와 작업 중 하나를 선택하려면 예외를 발생시키지 않고 행을 조회하세요. filter(pk=...).first()는 행이 있으면 반환하고, 없으면 None을 반환합니다.

challenge icon

챌린지

쉬움

작업 하나를 위한 엔드포인트를 추가하세요.

  1. tasks/views.py에 task_detail(request, pk)를 추가하세요. 이 함수는 task_to_dict(task)를 JSON으로 응답합니다. 해당 ID의 작업이 없으면 상태 코드 404와 {"error": "Task not found"}로 응답하세요.
  2. tasks/urls.py에 "api/tasks/<int:pk>/" 경로를 추가하고 이름을 task_detail로 지정하세요.

/api/tasks/99/를 열면 {"error": "Task not found"}가 표시됩니다.

직접 해보기

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 플레이그라운드