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을 반환합니다.
챌린지
쉬움작업 하나를 위한 엔드포인트를 추가하세요.
tasks/views.py에task_detail(request, pk)를 추가하세요. 이 함수는task_to_dict(task)를 JSON으로 응답합니다. 해당 ID의 작업이 없으면 상태 코드404와{"error": "Task not found"}로 응답하세요.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)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
JSON API의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드