109 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
import logging
 | 
						|
 | 
						|
 | 
						|
from rest_framework import serializers
 | 
						|
from rest_framework.generics import ListAPIView
 | 
						|
from rest_framework.pagination import PageNumberPagination,_positive_int,InvalidPage
 | 
						|
from rest_framework.response import Response
 | 
						|
from rest_framework.views import exception_handler
 | 
						|
from django.core.paginator import InvalidPage
 | 
						|
from rest_framework.exceptions import NotFound
 | 
						|
 | 
						|
 | 
						|
 | 
						|
error_logger = logging.getLogger('error')
 | 
						|
info_logger = logging.getLogger('info')
 | 
						|
 | 
						|
 | 
						|
class CommonPagination(PageNumberPagination):
 | 
						|
    """
 | 
						|
    分页设置
 | 
						|
    """
 | 
						|
    page_size = 10
 | 
						|
    page_size_query_param = 'limit'
 | 
						|
    # def paginate_queryset(self, queryset, request, view=None):
 | 
						|
    #     """
 | 
						|
    #     重写该方法,确保post请求也可分页
 | 
						|
    #     """
 | 
						|
    #     page_size = self.get_page_size(request)
 | 
						|
    #     if not page_size:
 | 
						|
    #         return None
 | 
						|
 | 
						|
    #     paginator = self.django_paginator_class(queryset, page_size)
 | 
						|
    #     if self.page_query_param in request.query_params:
 | 
						|
    #         page_number = request.query_params.get(self.page_query_param)
 | 
						|
    #     elif self.page_query_param in request.data:
 | 
						|
    #         page_number = request.data.get(self.page_query_param)
 | 
						|
    #     else:
 | 
						|
    #         page_number = 1
 | 
						|
    #     if page_number in self.last_page_strings:
 | 
						|
    #         page_number = paginator.num_pages
 | 
						|
 | 
						|
    #     try:
 | 
						|
    #         self.page = paginator.page(page_number)
 | 
						|
    #     except InvalidPage as exc:
 | 
						|
    #         msg = self.invalid_page_message.format(
 | 
						|
    #             page_number=page_number, message=str(exc)
 | 
						|
    #         )
 | 
						|
    #         raise NotFound(msg)
 | 
						|
 | 
						|
    #     if paginator.num_pages > 1 and self.template is not None:
 | 
						|
    #         # The browsable API should display pagination controls.
 | 
						|
    #         self.display_page_controls = True
 | 
						|
 | 
						|
    #     self.request = request
 | 
						|
    #     return list(self.page)
 | 
						|
 | 
						|
    # def get_page_size(self, request):
 | 
						|
    #     if self.page_size_query_param:
 | 
						|
    #         try:
 | 
						|
    #             if self.page_size_query_param in request.query_params:
 | 
						|
    #                 page_size = request.query_params.get(self.page_size_query_param)
 | 
						|
    #             else:
 | 
						|
    #                 page_size = request.data.get(self.page_size_query_param)
 | 
						|
    #             return _positive_int(
 | 
						|
    #                 page_size,
 | 
						|
    #                 strict=True,
 | 
						|
    #                 cutoff=self.max_page_size
 | 
						|
    #             )
 | 
						|
    #         except (KeyError, ValueError):
 | 
						|
    #             pass
 | 
						|
 | 
						|
    #     return self.page_size
 | 
						|
 | 
						|
 | 
						|
class TreeSerializer(serializers.Serializer):
 | 
						|
    id = serializers.IntegerField()
 | 
						|
    label = serializers.CharField(max_length=20, source='name')
 | 
						|
    pid = serializers.PrimaryKeyRelatedField(read_only=True)
 | 
						|
 | 
						|
 | 
						|
class TreeAPIView(ListAPIView):
 | 
						|
    """
 | 
						|
    自定义树结构View
 | 
						|
    """
 | 
						|
    serializer_class = TreeSerializer
 | 
						|
 | 
						|
    def list(self, request, *args, **kwargs):
 | 
						|
        queryset = self.filter_queryset(self.get_queryset())
 | 
						|
        page = self.paginate_queryset(queryset)
 | 
						|
        serializer = self.get_serializer(queryset, many=True)
 | 
						|
        tree_dict = {}
 | 
						|
        tree_data = []
 | 
						|
        try:
 | 
						|
            for item in serializer.data:
 | 
						|
                tree_dict[item['id']] = item
 | 
						|
            for i in tree_dict:
 | 
						|
                if tree_dict[i]['pid']:
 | 
						|
                    pid = tree_dict[i]['pid']
 | 
						|
                    parent = tree_dict[pid]
 | 
						|
                    parent.setdefault('children', []).append(tree_dict[i])
 | 
						|
                else:
 | 
						|
                    tree_data.append(tree_dict[i])
 | 
						|
            results = tree_data
 | 
						|
        except KeyError:
 | 
						|
            results = serializer.data
 | 
						|
        if page is not None:
 | 
						|
            return self.get_paginated_response(results)
 | 
						|
        return Response(results)
 |