Menu
CoddyTech

Một tác vụ theo ID

Thuộc phần API JSON trong hành trình Django của Coddy. Bài học 3 trên 19.

Một chương trình trước đây đọc danh sách giờ muốn lấy một tác vụ, qua URL riêng: /api/tasks/1/. Tuyến đường nhận id bằng <int:pk>, giống như các trang chi tiết của bạn, còn hàm trợ giúp task_to_dict(task) có sẵn trong phần khởi đầu chuyển một tác vụ thành từ điển.

Điểm mới là trường hợp không tìm thấy tác vụ. get_object_or_404 trả về trang HTML 404 của Django, chương trình không thể đọc trang này, nên API cũng gửi lỗi dưới dạng JSON, kèm mã trạng thái phù hợp, con số cho biết yêu cầu đã được xử lý như thế nào: 200 OK, 403 Forbidden, 404 Not Found. JsonResponse nhận mã này qua status:

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

Để chọn giữa lỗi và tác vụ, hãy tìm hàng mà không làm phát sinh ngoại lệ: filter(pk=...).first() trả về hàng đó, hoặc None nếu không có hàng nào.

challenge icon

Thử thách

Dễ

Thêm một endpoint cho một nhiệm vụ.

  1. Trong tasks/views.py, thêm task_detail(request, pk). Hàm này trả về task_to_dict(task) dưới dạng JSON. Khi không có nhiệm vụ nào có id đó, hãy trả về trạng thái 404 và {"error": "Task not found"}.
  2. Trong tasks/urls.py, thêm route "api/tasks/<int:pk>/" có tên task_detail.

Mở /api/tasks/99/: bạn sẽ thấy {"error": "Task not found"}.

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong API JSON

Tự luyện tập: Playground Django