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)
|