Tại sao DRF đôi khi khiến chúng ta cảm thấy hụt hơi?
Nếu đã gắn bó với hệ sinh thái Django, chắc hẳn bạn không lạ gì Django Rest Framework (DRF). Đây là một thư viện tiêu chuẩn, mạnh mẽ và cực kỳ đầy đủ. Tuy nhiên, DRF thường đi kèm với một cái giá: sự cồng kềnh. Việc định nghĩa Serializers phức tạp hay lồng ghép các lớp chỉ để trả về vài trường dữ liệu đôi khi khiến dự án trở nên nặng nề hơn mức cần thiết.
Trong một dự án thực tế yêu cầu xử lý hơn 1.500 request mỗi giây, mình từng gặp bế tắc khi logic validation quá nặng. Đó là lúc mình tìm đến Django Ninja. Trải nghiệm này giống như việc bạn mang sự linh hoạt của FastAPI đặt vào bộ khung vững chắc của Django vậy.
Điểm khác biệt cốt lõi nằm ở việc Django Ninja tận dụng Type Hints và Pydantic. Cách tiếp cận này giúp giảm thiểu đáng kể boilerplate code. Theo nhiều benchmark, Pydantic v2 có tốc độ parse dữ liệu nhanh hơn gấp 5-10 lần so với Serializer truyền thống của DRF.
Django Ninja là gì và tại sao bạn nên quan tâm?
Hiểu đơn giản, Django Ninja là một thư viện giúp xây dựng API dựa trên các tính năng hiện đại của Python 3. Nó không cố gắng thay thế hoàn toàn Django mà chỉ tập trung vào việc tối ưu hóa lớp giao tiếp API.
Dưới đây là những lý do khiến mình ưu tiên sử dụng nó cho các microservices mới:
- Hiệu suất vượt trội: Nhờ Pydantic, việc kiểm tra và chuyển đổi dữ liệu diễn ra gần như tức thì.
- Tài liệu tự động: Chỉ cần viết code, bạn sẽ có ngay Swagger UI và ReDoc tại đường dẫn
/docs. - Type Safety: VS Code hay PyCharm sẽ gợi ý code cực chuẩn, giúp bạn bắt lỗi ngay khi đang gõ phím.
- Hỗ trợ Async: Bạn có thể sử dụng
async defđể xử lý các tác vụ chờ đợi I/O mà không làm nghẽn hệ thống.
Bắt tay vào xây dựng API quản lý bài viết
Để thấy rõ sự tinh gọn, chúng ta sẽ cùng xây dựng một ứng dụng Blog nhỏ. Mình mặc định bạn đã khởi tạo một dự án Django cơ bản.
Bước 1: Cài đặt thư viện
Việc cài đặt chỉ mất vài giây với lệnh pip:
pip install django-ninja
Bước 2: Model dữ liệu
Trong file models.py, chúng ta định nghĩa cấu trúc bảng đơn giản:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
is_published = models.BooleanField(default=False)
Bước 3: Định nghĩa Schema với Pydantic
Thay vì các bộ Serializer dài dòng, chúng ta sử dụng Schema để mô tả dữ liệu đầu vào và đầu ra. Tạo file schemas.py:
from ninja import Schema
from datetime import datetime
class PostIn(Schema):
title: str
content: str
is_published: bool = False
class PostOut(Schema):
id: int
title: str
content: str
created_at: datetime
Việc tách biệt In và Out giúp kiểm soát dữ liệu chặt chẽ hơn. Bạn sẽ không bao giờ lo lắng về việc vô tình để lộ các trường nhạy cảm như mật khẩu hay mã định danh nội bộ.
Bước 4: Triển khai Endpoints
Tại file api.py, bạn sẽ thấy sự tương đồng thú vị với FastAPI:
from ninja import NinjaAPI
from typing import List
from .models import Post
from .schemas import PostIn, PostOut
api = NinjaAPI()
@api.get("/posts", response=List[PostOut])
def list_posts(request):
return Post.objects.all()
@api.post("/posts", response=PostOut)
def create_post(request, data: PostIn):
post = Post.objects.create(**data.dict())
return post
Code trông rất thoáng và dễ bảo trì. Mọi thứ đều được định kiểu rõ ràng.
Bước 5: Cấu hình Routing
Cuối cùng, hãy đăng ký API vào urls.py của project:
from django.urls import path
from .api import api
urlpatterns = [
path("api/", api.urls),
]
Bài học từ thực tế: Validation và Tối ưu hóa
Một điểm mình cực kỳ thích ở Django Ninja là cách nó xử lý lỗi. Nếu người dùng gửi sai định dạng, hệ thống tự động trả về mã lỗi 422 kèm mô tả chi tiết vị trí lỗi. Bạn không cần viết thêm bất kỳ dòng code xử lý ngoại lệ thủ công nào cho các trường hợp này.
Kinh nghiệm xương máu: Khi làm việc với database lớn, hãy kết hợp .values() hoặc .only() của Django ORM. Django Ninja xử lý các dictionary này cực nhanh, giúp giảm tải cho bộ nhớ server đáng kể.
Kiểm tra thành quả với Swagger
Chạy server và truy cập http://127.0.0.1:8000/api/docs. Bạn sẽ thấy một giao diện tương tác chuyên nghiệp. Tại đây, bạn có thể thử nghiệm (Try it out) các endpoint mà không cần mở Postman.
Lời kết
Django Ninja không sinh ra để tiêu diệt DRF. Tuy nhiên, nó là lựa chọn sáng giá cho các dự án ưu tiên tốc độ và sự gọn nhẹ. Nếu bạn đang mệt mỏi với đống code Serializer rườm rà, hãy thử chuyển sang Django Ninja. Chắc chắn hiệu suất làm việc của bạn sẽ tăng lên đáng kể.

