class EmployeeSerializer(DynamicFieldsModelSerializer): ''' Serializer for employee with user info, groups basic info, depts basic info ''' user = UserSerializer(source='*') groups = GroupSerializer(many=True, read_only=True) depts = DeptSerializer(many=True, read_only=True) nodes = serializers.SerializerMethodField() group_uids = serializers.PrimaryKeyRelatedField( queryset=Group.objects.all(), many=True, pk_field='uid', write_only=True, required=False) dept_uids = serializers.PrimaryKeyRelatedField(queryset=Dept.objects.all(), many=True, pk_field='uid', write_only=True, required=False) node_uids = serializers.PrimaryKeyRelatedField( queryset=Group.objects.all(), many=True, pk_field='uid', write_only=True, required=False) class Meta: # pylint: disable=missing-docstring model = User fields = ( 'group_uids', 'dept_uids', 'node_uids', 'user', 'groups', 'depts', 'nodes', ) def get_nodes(self, obj): # pylint: disable=no-self-use ''' groups + nodes ''' for item in self.get_groups(obj): yield item for item in DeptSerializer(obj.depts, many=True).data: yield item def get_groups(self, obj): # pylint: disable=no-self-use ''' 出于业务需要,extern 不予展示 ''' return GroupSerializer( [group for group in obj.groups if group.uid != 'extern'], many=True).data
def get_nodes(self, obj): # pylint: disable=no-self-use ''' groups + nodes ''' for item in self.get_groups(obj): yield item for item in DeptSerializer(obj.depts, many=True).data: yield item
def get(self, request, *args, **kwargs): user = self.get_object() data = DeptSerializer(user.depts, many=True).data + \ GroupSerializer(user.groups, many=True).data return Response({'nodes': data})