DRF cho 3 style pagination, mỗi cái tối ưu cho một kiểu UI/dataset khác nhau.
PageNumberPagination (?page=2&page_size=20) hiển thị "Page 1 / 2 / 3 ..." — hợp với UI có số trang. Đơn giản, nhưng OFFSET càng lớn càng chậm. LimitOffsetPagination (?limit=20&offset=40) linh hoạt cho client tự quản, gặp cùng vấn đề OFFSET chậm trên bảng to. CursorPagination (?cursor=cD0yMDI2...) dùng cột sắp xếp (-created_at) làm cursor, nên mọi trang đều O(log n) — không có "page number" và "tổng trang" nhưng cực hợp infinite scroll, feed real-time.
class PostCursorPagination(CursorPagination):
page_size = 20
ordering = '-created_at'
cursor_query_param = 'cursor'
class PostViewSet(viewsets.ModelViewSet):
pagination_class = PostCursorPaginationBảng quá 1M row mà dùng page-number pagination kèm count() mỗi request là một sai lầm về hiệu năng — COUNT(*) quét toàn bảng, response chậm vài giây.
Cách giải: hoặc override paginator.get_paginated_response để bỏ count, hoặc đổi sang cursor luôn.