35 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
from rest_framework.pagination import PageNumberPagination, _positive_int
 | 
						|
from rest_framework.exceptions import ParseError
 | 
						|
 | 
						|
 | 
						|
class MyPagination(PageNumberPagination):
 | 
						|
    """
 | 
						|
    自定义分页/传入page为0则不分页
 | 
						|
    """
 | 
						|
    page_size = 10
 | 
						|
    page_size_query_param = 'page_size'
 | 
						|
 | 
						|
    def get_page_number(self, request, paginator):
 | 
						|
        if 'page' in request.data:
 | 
						|
            return request.data['page']
 | 
						|
        return super().get_page_number(request, paginator)
 | 
						|
 | 
						|
    def get_page_size(self, request):
 | 
						|
        if 'page_size' in request.data:
 | 
						|
            try:
 | 
						|
                return _positive_int(
 | 
						|
                    request.data['page_size'],
 | 
						|
                    strict=True,
 | 
						|
                    cutoff=self.max_page_size
 | 
						|
                )
 | 
						|
            except (KeyError, ValueError):
 | 
						|
                pass
 | 
						|
        return super().get_page_size(request)
 | 
						|
 | 
						|
    def paginate_queryset(self, queryset, request, view=None):
 | 
						|
        if request.query_params.get('pageoff', None) or request.query_params.get('page', None) == '0' or request.data.get('page', None) in (0, '0'):
 | 
						|
            if queryset.count() < 3000:
 | 
						|
                return None
 | 
						|
            raise ParseError('单次请求数据量大,请分页获取')
 | 
						|
        return super().paginate_queryset(queryset, request, view=view)
 |