class VirtualMachineSerializer(TaggedObjectSerializer, StatusModelSerializerMixin, CustomFieldModelSerializer): url = serializers.HyperlinkedIdentityField( view_name="virtualization-api:virtualmachine-detail") site = NestedSiteSerializer(read_only=True) cluster = NestedClusterSerializer() role = NestedDeviceRoleSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) platform = NestedPlatformSerializer(required=False, allow_null=True) primary_ip = NestedIPAddressSerializer(read_only=True) primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True) primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True) local_context_schema = NestedConfigContextSchemaSerializer(required=False, allow_null=True) class Meta: model = VirtualMachine fields = [ "id", "url", "name", "status", "site", "cluster", "role", "tenant", "platform", "primary_ip", "primary_ip4", "primary_ip6", "vcpus", "memory", "disk", "comments", "local_context_data", "local_context_schema", "tags", "custom_fields", "created", "last_updated", "computed_fields", ] validators = [] opt_in_fields = ["computed_fields"]
class DeviceSerializer(TaggedObjectSerializer, StatusModelSerializerMixin, CustomFieldModelSerializer): url = serializers.HyperlinkedIdentityField( view_name="dcim-api:device-detail") device_type = NestedDeviceTypeSerializer() device_role = NestedDeviceRoleSerializer() tenant = NestedTenantSerializer(required=False, allow_null=True) platform = NestedPlatformSerializer(required=False, allow_null=True) site = NestedSiteSerializer() rack = NestedRackSerializer(required=False, allow_null=True) face = ChoiceField(choices=DeviceFaceChoices, allow_blank=True, required=False) primary_ip = NestedIPAddressSerializer(read_only=True) primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True) primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True) parent_device = serializers.SerializerMethodField() cluster = NestedClusterSerializer(required=False, allow_null=True) virtual_chassis = NestedVirtualChassisSerializer(required=False, allow_null=True) local_context_schema = NestedConfigContextSchemaSerializer(required=False, allow_null=True) class Meta: model = Device fields = [ "id", "url", "name", "device_type", "device_role", "tenant", "platform", "serial", "asset_tag", "site", "rack", "position", "face", "parent_device", "status", "primary_ip", "primary_ip4", "primary_ip6", "cluster", "virtual_chassis", "vc_position", "vc_priority", "comments", "local_context_schema", "local_context_data", "tags", "custom_fields", "created", "last_updated", "computed_fields", ] opt_in_fields = ["computed_fields"] validators = [] def validate(self, data): # Validate uniqueness of (rack, position, face) since we omitted the automatically-created validator from Meta. if data.get("rack") and data.get("position") and data.get("face"): validator = UniqueTogetherValidator(queryset=Device.objects.all(), fields=("rack", "position", "face")) validator(data, self) # Enforce model validation super().validate(data) return data @swagger_serializer_method(serializer_or_field=NestedDeviceSerializer) def get_parent_device(self, obj): try: device_bay = obj.parent_bay except DeviceBay.DoesNotExist: return None context = {"request": self.context["request"]} data = NestedDeviceSerializer(instance=device_bay.device, context=context).data data["device_bay"] = NestedDeviceBaySerializer(instance=device_bay, context=context).data return data