2015-11-03 16 views
7

Tôi đang làm việc trên một api được xây dựng với Django Rest Framework. Tôi đã xác định một số lớp học model và tôi cũng đã tạo một số bộ lọc để áp dụng cho một số truy vấn nhất định xảy ra trong api-endpoints được chỉ định.Cách giới hạn kết quả truy vấn bằng bộ lọc Django Rest

Tôi đang cố gắng áp dụng LIMIT trong số queryset nhưng tôi muốn không sử dụng ký pháp Django e.x. Entry.objects.all()[:5]. Thay vào đó, tôi muốn có thể áp dụng giới hạn từ bên trong bộ lọc được liên kết với mô hình.

Cho đến bây giờ tôi chưa tìm thấy giải pháp nào. Tôi nghĩ rằng tôi nên tìm một cách để xác định một bộ lọc với giá trị mặc định sẽ dẫn đến việc không giới hạn queryset và nếu yêu cầu đạt đến điểm cuối và chứa một cái gì đó như ?filter=10 thì queryset sẽ được giới hạn ở đầu tiên 10.

Trả lời

3

bạn có thể sử dụng Django nghỉ ngơi Khung pagination. Pagination_class LimitOffsetPagination cung cấp cho bạn khả năng giới hạn số lượng các mục được trả về trong một query_param.

http://www.django-rest-framework.org/api-guide/pagination/

+0

Đó là rất gần với những gì tôi cần thực sự! Mặc dù trong trường hợp đó, tôi muốn ghi đè lên lớp 'LimitOffsetPagination' và đưa cho tham số' offset' một giá trị mặc định (có thể là 0) để người dùng chỉ phải chỉ định tham số 'limit'. Tôi đang nghĩ đến việc sử dụng 'PageNumberPagination' và ghi đè tham số' page_size_query_param' để có giá trị mặc định 'giới hạn'. Điều đó có hợp lý không? – LetsPlayYahtzee

+0

Vâng, đây là giải pháp tốt. Như đã nêu trong tài liệu, tham số '' page_size_query_param'' có thể được sử dụng để cho phép máy khách điều khiển kích thước trang yêu cầu. Trong '' PageNumberPagination'', tham số này được thiết lập mặc định là None. –

+0

Điều đó nghe có vẻ ngớ ngẩn, nhưng tôi không thể tìm ra nơi để đặt lớp phân trang tùy chỉnh. – LetsPlayYahtzee

1

Bạn có thể mở rộng hoặc tùy chỉnh các lớp học pagination sẵn trong drf

class UserSpecificPagination(LimitOffsetPagination): 
     def get_limit(self, request): 
      if logic_met(request.user): 
      self.max_limit = custom_limit 
     return super(UserSpecificPagination, self).get_limit(request) 

thiết lập các lớp như pagination_class trong listapiview hoặc DRF cài đặt

Các vấn đề liên quan