40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
 | 
						|
from rest_framework import serializers
 | 
						|
 | 
						|
 | 
						|
 | 
						|
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)
 |