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.
Thử thách
DễThêm một endpoint cho một nhiệm vụ.
- Trong
tasks/views.py, thêmtask_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ái404và{"error": "Task not found"}. - Trong
tasks/urls.py, thêm route"api/tasks/<int:pk>/"có têntask_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)
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