Ba mức trừu tượng chồng lên nhau, chọn theo mức độ "chuẩn CRUD" của endpoint.
APIView— gần nhất với view thuần: bạn tự viếtget(),post(). Dùng khi endpoint không phải CRUD trên một model:/auth/login,/reports/export, endpoint gọi service ngoài.- Generic view (
ListCreateAPIView,RetrieveUpdateDestroyAPIView) — khai báoqueryset+serializer_class, DRF lo phần còn lại. Dùng khi endpoint là CRUD nhưng bạn muốn tự kiểm soát URL. ModelViewSet— gộp cả 6 action (list,create,retrieve,update,partial_update,destroy) vào một class, đăng ký quaRouterđể tự sinh URL.
python
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all()
serializer_class = OrderSerializer
router.register(r'orders', OrderViewSet)Nguyên tắc chọn: resource CRUD tiêu chuẩn → ModelViewSet.
- Cần một hai action lẻ, URL không theo quy ước router → generic view.
- Logic không map vào model →
APIView. - Đừng ép mọi thứ vào
ModelViewSetrồi override nửa số method — lúc đó generic view dễ đọc hơn.