From fb2bfe23375c5ffa718424ae8ae0c751eabafae0 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 13 Jul 2022 15:12:53 -0400 Subject: [PATCH] Introduce GenericObjectSerializer --- netbox/netbox/api/serializers/__init__.py | 1 + netbox/netbox/api/serializers/generic.py | 31 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 netbox/netbox/api/serializers/generic.py diff --git a/netbox/netbox/api/serializers/__init__.py b/netbox/netbox/api/serializers/__init__.py index adc556549..0ec3ab5f3 100644 --- a/netbox/netbox/api/serializers/__init__.py +++ b/netbox/netbox/api/serializers/__init__.py @@ -2,6 +2,7 @@ from rest_framework import serializers from .base import * from .features import * +from .generic import * from .nested import * diff --git a/netbox/netbox/api/serializers/generic.py b/netbox/netbox/api/serializers/generic.py new file mode 100644 index 000000000..81ec338ff --- /dev/null +++ b/netbox/netbox/api/serializers/generic.py @@ -0,0 +1,31 @@ +from django.contrib.contenttypes.models import ContentType +from rest_framework import serializers + +from netbox.api import ContentTypeField +from utilities.utils import content_type_identifier + +__all__ = ( + 'GenericObjectSerializer', +) + + +class GenericObjectSerializer(serializers.Serializer): + """ + Minimal representation of some generic object identified by ContentType and PK. + """ + object_type = ContentTypeField( + queryset=ContentType.objects.all() + ) + object_id = serializers.IntegerField() + + def to_internal_value(self, data): + data = super().to_internal_value(data) + model = data['object_type'].model_class() + return model.objects.get(pk=data['object_id']) + + def to_representation(self, instance): + ct = ContentType.objects.get_for_model(instance) + return { + 'object_type': content_type_identifier(ct), + 'object_id': instance.pk, + }