diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 6b285620f..d4e403598 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -175,6 +175,28 @@ class WritableRackSerializer(serializers.ModelSerializer): return data +# +# Rack units +# + +class NestedDeviceSerializer(serializers.ModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') + + class Meta: + model = Device + fields = ['id', 'url', 'name', 'display_name'] + + +class RackUnitSerializer(serializers.Serializer): + """ + A rack unit is an abstraction formed by the set (rack, position, face); it does not exist as a row in the database. + """ + id = serializers.IntegerField(read_only=True) + name = serializers.CharField(read_only=True) + face = serializers.IntegerField(read_only=True) + device = NestedDeviceSerializer(read_only=True) + + # # Rack reservations # @@ -454,14 +476,6 @@ class DeviceSerializer(CustomFieldModelSerializer): } -class NestedDeviceSerializer(serializers.ModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') - - class Meta: - model = Device - fields = ['id', 'url', 'name', 'display_name'] - - class WritableDeviceSerializer(serializers.ModelSerializer): class Meta: diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 0e1923ce6..ac4c4cb56 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -96,15 +96,10 @@ class RackViewSet(WritableSerializerMixin, CustomFieldModelViewSet): exclude_pk = None elevation = rack.get_rack_units(face, exclude_pk) - # Serialize Devices within the rack elevation - for u in elevation: - if u['device']: - u['device'] = serializers.NestedDeviceSerializer( - instance=u['device'], - context={'request': request}, - ).data - - return Response(elevation) + page = self.paginate_queryset(elevation) + if page is not None: + rack_units = serializers.RackUnitSerializer(page, many=True, context={'request': request}) + return self.get_paginated_response(rack_units.data) #