Initialize dynamically-resolved serializers with nested=True

This commit is contained in:
Jeremy Stretch 2024-02-27 14:56:36 -05:00
parent ca56c8b9ef
commit 78e284c14f
19 changed files with 54 additions and 88 deletions

View File

@ -2,7 +2,6 @@ from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema_field from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers from rest_framework import serializers
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
__all__ = ( __all__ = (
@ -29,9 +28,9 @@ class ConnectedEndpointsSerializer(serializers.ModelSerializer):
Return the appropriate serializer for the type of connected object. Return the appropriate serializer for the type of connected object.
""" """
if endpoints := obj.connected_endpoints: if endpoints := obj.connected_endpoints:
serializer = get_serializer_for_model(endpoints[0], prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(endpoints[0])
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(endpoints, many=True, context=context).data return serializer(endpoints, nested=True, many=True, context=context).data
@extend_schema_field(serializers.BooleanField) @extend_schema_field(serializers.BooleanField)
def get_connected_endpoints_reachable(self, obj): def get_connected_endpoints_reachable(self, obj):

View File

@ -8,7 +8,6 @@ from dcim.constants import *
from dcim.models import Cable, CablePath, CableTermination from dcim.models import Cable, CablePath, CableTermination
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import GenericObjectSerializer, NetBoxModelSerializer from netbox.api.serializers import GenericObjectSerializer, NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from tenancy.api.serializers_.tenants import TenantSerializer from tenancy.api.serializers_.tenants import TenantSerializer
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
@ -67,9 +66,9 @@ class CableTerminationSerializer(NetBoxModelSerializer):
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_termination(self, obj): def get_termination(self, obj):
serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.termination)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.termination, context=context).data return serializer(obj.termination, nested=True, context=context).data
class CablePathSerializer(serializers.ModelSerializer): class CablePathSerializer(serializers.ModelSerializer):
@ -83,9 +82,9 @@ class CablePathSerializer(serializers.ModelSerializer):
def get_path(self, obj): def get_path(self, obj):
ret = [] ret = []
for nodes in obj.path_objects: for nodes in obj.path_objects:
serializer = get_serializer_for_model(nodes[0], prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(nodes[0])
context = {'request': self.context['request']} context = {'request': self.context['request']}
ret.append(serializer(nodes, context=context, many=True).data) ret.append(serializer(nodes, nested=True, many=True, context=context).data)
return ret return ret
@ -118,9 +117,9 @@ class CabledObjectSerializer(serializers.ModelSerializer):
return [] return []
# Return serialized peer termination objects # Return serialized peer termination objects
serializer = get_serializer_for_model(obj.link_peers[0], prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.link_peers[0])
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.link_peers, context=context, many=True).data return serializer(obj.link_peers, nested=True, many=True, context=context).data
@extend_schema_field(serializers.BooleanField) @extend_schema_field(serializers.BooleanField)
def get__occupied(self, obj): def get__occupied(self, obj):

View File

@ -13,10 +13,10 @@ from ipam.api.serializers_.vrfs import VRFSerializer
from ipam.models import VLAN from ipam.models import VLAN
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer
from wireless.api.nested_serializers import NestedWirelessLinkSerializer from wireless.api.nested_serializers import NestedWirelessLinkSerializer
from wireless.api.serializers_.wirelesslans import WirelessLANSerializer
from wireless.choices import * from wireless.choices import *
from wireless.models import WirelessLAN from wireless.models import WirelessLAN
from .base import ConnectedEndpointsSerializer from .base import ConnectedEndpointsSerializer
@ -24,7 +24,6 @@ from .cables import CabledObjectSerializer
from .devices import DeviceSerializer, ModuleSerializer, VirtualDeviceContextSerializer from .devices import DeviceSerializer, ModuleSerializer, VirtualDeviceContextSerializer
from .manufacturers import ManufacturerSerializer from .manufacturers import ManufacturerSerializer
from .roles import InventoryItemRoleSerializer from .roles import InventoryItemRoleSerializer
from wireless.api.serializers_.wirelesslans import WirelessLANSerializer
from ..nested_serializers import * from ..nested_serializers import *
__all__ = ( __all__ = (
@ -364,6 +363,6 @@ class InventoryItemSerializer(NetBoxModelSerializer):
def get_component(self, obj): def get_component(self, obj):
if obj.component is None: if obj.component is None:
return None return None
serializer = get_serializer_for_model(obj.component, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.component)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.component, context=context).data return serializer(obj.component, nested=True, context=context).data

View File

@ -10,7 +10,6 @@ from dcim.models import (
) )
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import ValidatedModelSerializer from netbox.api.serializers import ValidatedModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from wireless.choices import * from wireless.choices import *
from .devicetypes import DeviceTypeSerializer, ModuleTypeSerializer from .devicetypes import DeviceTypeSerializer, ModuleTypeSerializer
@ -323,6 +322,6 @@ class InventoryItemTemplateSerializer(ValidatedModelSerializer):
def get_component(self, obj): def get_component(self, obj):
if obj.component is None: if obj.component is None:
return None return None
serializer = get_serializer_for_model(obj.component, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.component)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.component, context=context).data return serializer(obj.component, nested=True, context=context).data

View File

@ -7,7 +7,6 @@ from rest_framework.response import Response
from rest_framework.routers import APIRootView from rest_framework.routers import APIRootView
from rest_framework.viewsets import ViewSet from rest_framework.viewsets import ViewSet
from circuits.models import Circuit
from dcim import filtersets from dcim import filtersets
from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH
from dcim.models import * from dcim.models import *
@ -18,10 +17,8 @@ from netbox.api.metadata import ContentTypeMetadata
from netbox.api.pagination import StripCountAnnotationsPaginator from netbox.api.pagination import StripCountAnnotationsPaginator
from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin
from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from utilities.query_functions import CollateAsChar from utilities.query_functions import CollateAsChar
from utilities.utils import count_related
from . import serializers from . import serializers
from .exceptions import MissingFilterException from .exceptions import MissingFilterException
@ -60,16 +57,16 @@ class PathEndpointMixin(object):
# Serialize path objects, iterating over each three-tuple in the path # Serialize path objects, iterating over each three-tuple in the path
for near_ends, cable, far_ends in obj.trace(): for near_ends, cable, far_ends in obj.trace():
if near_ends: if near_ends:
serializer_a = get_serializer_for_model(near_ends[0], prefix=NESTED_SERIALIZER_PREFIX) serializer_a = get_serializer_for_model(near_ends[0])
near_ends = serializer_a(near_ends, many=True, context={'request': request}).data near_ends = serializer_a(near_ends, nested=True, many=True, context={'request': request}).data
else: else:
# Path is split; stop here # Path is split; stop here
break break
if cable: if cable:
cable = serializers.TracedCableSerializer(cable[0], context={'request': request}).data cable = serializers.TracedCableSerializer(cable[0], context={'request': request}).data
if far_ends: if far_ends:
serializer_b = get_serializer_for_model(far_ends[0], prefix=NESTED_SERIALIZER_PREFIX) serializer_b = get_serializer_for_model(far_ends[0])
far_ends = serializer_b(far_ends, many=True, context={'request': request}).data far_ends = serializer_b(far_ends, nested=True, many=True, context={'request': request}).data
path.append((near_ends, cable, far_ends)) path.append((near_ends, cable, far_ends))

View File

@ -1,13 +1,12 @@
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from drf_spectacular.utils import extend_schema_field
from drf_spectacular.types import OpenApiTypes from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema_field
from rest_framework.fields import Field from rest_framework.fields import Field
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
from extras.choices import CustomFieldTypeChoices from extras.choices import CustomFieldTypeChoices
from extras.models import CustomField from extras.models import CustomField
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
@ -58,11 +57,11 @@ class CustomFieldsDataField(Field):
for cf in self._get_custom_fields(): for cf in self._get_custom_fields():
value = cf.deserialize(obj.get(cf.name)) value = cf.deserialize(obj.get(cf.name))
if value is not None and cf.type == CustomFieldTypeChoices.TYPE_OBJECT: if value is not None and cf.type == CustomFieldTypeChoices.TYPE_OBJECT:
serializer = get_serializer_for_model(cf.object_type.model_class(), prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(cf.object_type.model_class())
value = serializer(value, context=self.parent.context).data value = serializer(value, nested=True, context=self.parent.context).data
elif value is not None and cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: elif value is not None and cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT:
serializer = get_serializer_for_model(cf.object_type.model_class(), prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(cf.object_type.model_class())
value = serializer(value, many=True, context=self.parent.context).data value = serializer(value, nested=True, many=True, context=self.parent.context).data
data[cf.name] = value data[cf.name] = value
return data return data
@ -80,12 +79,9 @@ class CustomFieldsDataField(Field):
CustomFieldTypeChoices.TYPE_OBJECT, CustomFieldTypeChoices.TYPE_OBJECT,
CustomFieldTypeChoices.TYPE_MULTIOBJECT CustomFieldTypeChoices.TYPE_MULTIOBJECT
): ):
serializer_class = get_serializer_for_model( serializer_class = get_serializer_for_model(cf.object_type.model_class())
model=cf.object_type.model_class(),
prefix=NESTED_SERIALIZER_PREFIX
)
many = cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT many = cf.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT
serializer = serializer_class(data=data[cf.name], many=many, context=self.parent.context) serializer = serializer_class(data=data[cf.name], nested=True, many=many, context=self.parent.context)
if serializer.is_valid(): if serializer.is_valid():
data[cf.name] = [obj['id'] for obj in serializer.data] if many else serializer.data['id'] data[cf.name] = [obj['id'] for obj in serializer.data] if many else serializer.data['id']
else: else:

View File

@ -6,7 +6,6 @@ from core.models import ContentType
from extras.models import ImageAttachment from extras.models import ImageAttachment
from netbox.api.fields import ContentTypeField from netbox.api.fields import ContentTypeField
from netbox.api.serializers import ValidatedModelSerializer from netbox.api.serializers import ValidatedModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
__all__ = ( __all__ = (
@ -46,5 +45,6 @@ class ImageAttachmentSerializer(ValidatedModelSerializer):
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_parent(self, obj): def get_parent(self, obj):
serializer = get_serializer_for_model(obj.parent, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.parent)
return serializer(obj.parent, context={'request': self.context['request']}).data context = {'request': self.context['request']}
return serializer(obj.parent, nested=True, context=context).data

View File

@ -5,7 +5,6 @@ from core.models import ContentType
from extras.models import Bookmark from extras.models import Bookmark
from netbox.api.fields import ContentTypeField from netbox.api.fields import ContentTypeField
from netbox.api.serializers import ValidatedModelSerializer from netbox.api.serializers import ValidatedModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from users.api.serializers_.users import UserSerializer from users.api.serializers_.users import UserSerializer
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
@ -31,5 +30,6 @@ class BookmarkSerializer(ValidatedModelSerializer):
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_object(self, instance): def get_object(self, instance):
serializer = get_serializer_for_model(instance.object, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(instance.object)
return serializer(instance.object, context={'request': self.context['request']}).data context = {'request': self.context['request']}
return serializer(instance.object, nested=True, context=context).data

View File

@ -6,7 +6,6 @@ from extras.models import ObjectChange
from netbox.api.exceptions import SerializerNotFound from netbox.api.exceptions import SerializerNotFound
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import BaseModelSerializer from netbox.api.serializers import BaseModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from users.api.serializers_.users import UserSerializer from users.api.serializers_.users import UserSerializer
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
@ -48,12 +47,9 @@ class ObjectChangeSerializer(BaseModelSerializer):
return None return None
try: try:
serializer = get_serializer_for_model(obj.changed_object, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.changed_object)
except SerializerNotFound: except SerializerNotFound:
return obj.object_repr return obj.object_repr
context = { data = serializer(obj.changed_object, nested=True, context={'request': self.context['request']}).data
'request': self.context['request']
}
data = serializer(obj.changed_object, context=context).data
return data return data

View File

@ -7,7 +7,6 @@ from extras.choices import *
from extras.models import EventRule, Webhook from extras.models import EventRule, Webhook
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from .scripts import ScriptSerializer from .scripts import ScriptSerializer
@ -51,11 +50,8 @@ class EventRuleSerializer(NetBoxModelSerializer):
instance = script.python_class() if script.python_class else None instance = script.python_class() if script.python_class else None
return ScriptSerializer(instance, nested=True, context=context).data return ScriptSerializer(instance, nested=True, context=context).data
else: else:
serializer = get_serializer_for_model( serializer = get_serializer_for_model(instance.action_object_type.model_class())
model=instance.action_object_type.model_class(), return serializer(instance.action_object, nested=True, context=context).data
prefix=NESTED_SERIALIZER_PREFIX
)
return serializer(instance.action_object, context=context).data
# #

View File

@ -8,7 +8,6 @@ from extras.choices import *
from extras.models import JournalEntry from extras.models import JournalEntry
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
__all__ = ( __all__ = (
@ -59,9 +58,6 @@ class JournalEntrySerializer(NetBoxModelSerializer):
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_assigned_object(self, instance): def get_assigned_object(self, instance):
serializer = get_serializer_for_model( serializer = get_serializer_for_model(instance.assigned_object_type.model_class())
instance.assigned_object_type.model_class(),
prefix=NESTED_SERIALIZER_PREFIX
)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(instance.assigned_object, context=context).data return serializer(instance.assigned_object, nested=True, context=context).data

View File

@ -5,7 +5,6 @@ from rest_framework import serializers
from ipam.models import FHRPGroup, FHRPGroupAssignment from ipam.models import FHRPGroup, FHRPGroupAssignment
from netbox.api.fields import ContentTypeField from netbox.api.fields import ContentTypeField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from .ip import IPAddressSerializer from .ip import IPAddressSerializer
@ -48,6 +47,6 @@ class FHRPGroupAssignmentSerializer(NetBoxModelSerializer):
def get_interface(self, obj): def get_interface(self, obj):
if obj.interface is None: if obj.interface is None:
return None return None
serializer = get_serializer_for_model(obj.interface, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.interface)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.interface, context=context).data return serializer(obj.interface, nested=True, context=context).data

View File

@ -8,16 +8,14 @@ from ipam.constants import IPADDRESS_ASSIGNMENT_MODELS
from ipam.models import Aggregate, IPAddress, IPRange, Prefix from ipam.models import Aggregate, IPAddress, IPRange, Prefix
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from tenancy.api.serializers_.tenants import TenantSerializer from tenancy.api.serializers_.tenants import TenantSerializer
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from ..field_serializers import IPAddressField, IPNetworkField
from ..nested_serializers import *
from .asns import RIRSerializer from .asns import RIRSerializer
from .vrfs import VRFSerializer
from .roles import RoleSerializer from .roles import RoleSerializer
from .vlans import VLANSerializer from .vlans import VLANSerializer
from .vrfs import VRFSerializer
from ..field_serializers import IPAddressField, IPNetworkField
from ..nested_serializers import *
__all__ = ( __all__ = (
'AggregateSerializer', 'AggregateSerializer',
@ -174,9 +172,9 @@ class IPAddressSerializer(NetBoxModelSerializer):
def get_assigned_object(self, obj): def get_assigned_object(self, obj):
if obj.assigned_object is None: if obj.assigned_object is None:
return None return None
serializer = get_serializer_for_model(obj.assigned_object, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.assigned_object)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.assigned_object, context=context).data return serializer(obj.assigned_object, nested=True, context=context).data
class AvailableIPSerializer(serializers.Serializer): class AvailableIPSerializer(serializers.Serializer):

View File

@ -8,11 +8,9 @@ from ipam.constants import VLANGROUP_SCOPE_TYPES
from ipam.models import VLAN, VLANGroup from ipam.models import VLAN, VLANGroup
from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from tenancy.api.serializers_.tenants import TenantSerializer from tenancy.api.serializers_.tenants import TenantSerializer
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer
from .roles import RoleSerializer from .roles import RoleSerializer
__all__ = ( __all__ = (
@ -53,10 +51,9 @@ class VLANGroupSerializer(NetBoxModelSerializer):
def get_scope(self, obj): def get_scope(self, obj):
if obj.scope_id is None: if obj.scope_id is None:
return None return None
serializer = get_serializer_for_model(obj.scope, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.scope)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.scope, nested=True, context=context).data
return serializer(obj.scope, context=context).data
class VLANSerializer(NetBoxModelSerializer): class VLANSerializer(NetBoxModelSerializer):

View File

@ -3,7 +3,6 @@ from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers from rest_framework import serializers
from netbox.api.fields import ContentTypeField from netbox.api.fields import ContentTypeField
from netbox.constants import NESTED_SERIALIZER_PREFIX
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from utilities.utils import content_type_identifier from utilities.utils import content_type_identifier
@ -40,6 +39,5 @@ class GenericObjectSerializer(serializers.Serializer):
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_object(self, obj): def get_object(self, obj):
serializer = get_serializer_for_model(obj, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj)
# context = {'request': self.context['request']} return serializer(obj, nested=True, context=self.context).data
return serializer(obj, context=self.context).data

View File

@ -1,4 +1,5 @@
# Prefix for nested serializers # Prefix for nested serializers
# TODO: Remove in v4.1
NESTED_SERIALIZER_PREFIX = 'Nested' NESTED_SERIALIZER_PREFIX = 'Nested'
# RQ queue names # RQ queue names

View File

@ -5,7 +5,6 @@ from rest_framework import serializers
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from tenancy.choices import ContactPriorityChoices from tenancy.choices import ContactPriorityChoices
from tenancy.models import ContactAssignment, Contact, ContactGroup, ContactRole from tenancy.models import ContactAssignment, Contact, ContactGroup, ContactRole
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
@ -77,6 +76,6 @@ class ContactAssignmentSerializer(NetBoxModelSerializer):
@extend_schema_field(OpenApiTypes.OBJECT) @extend_schema_field(OpenApiTypes.OBJECT)
def get_object(self, instance): def get_object(self, instance):
serializer = get_serializer_for_model(instance.content_type.model_class(), prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(instance.content_type.model_class())
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(instance.object, context=context).data return serializer(instance.object, nested=True, context=context).data

View File

@ -6,7 +6,6 @@ from ipam.api.serializers_.vrfs import RouteTargetSerializer
from ipam.models import RouteTarget from ipam.models import RouteTarget
from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from tenancy.api.serializers_.tenants import TenantSerializer from tenancy.api.serializers_.tenants import TenantSerializer
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from vpn.choices import * from vpn.choices import *
@ -66,6 +65,6 @@ class L2VPNTerminationSerializer(NetBoxModelSerializer):
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_assigned_object(self, instance): def get_assigned_object(self, instance):
serializer = get_serializer_for_model(instance.assigned_object, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(instance.assigned_object)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(instance.assigned_object, context=context).data return serializer(instance.assigned_object, nested=True, context=context).data

View File

@ -5,12 +5,10 @@ from rest_framework import serializers
from ipam.api.serializers_.ip import IPAddressSerializer from ipam.api.serializers_.ip import IPAddressSerializer
from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from netbox.constants import NESTED_SERIALIZER_PREFIX
from tenancy.api.serializers_.tenants import TenantSerializer from tenancy.api.serializers_.tenants import TenantSerializer
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from vpn.choices import * from vpn.choices import *
from vpn.models import Tunnel, TunnelGroup, TunnelTermination from vpn.models import Tunnel, TunnelGroup, TunnelTermination
from .crypto import IPSecProfileSerializer from .crypto import IPSecProfileSerializer
__all__ = ( __all__ = (
@ -109,6 +107,6 @@ class TunnelTerminationSerializer(NetBoxModelSerializer):
@extend_schema_field(serializers.JSONField(allow_null=True)) @extend_schema_field(serializers.JSONField(allow_null=True))
def get_termination(self, obj): def get_termination(self, obj):
serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX) serializer = get_serializer_for_model(obj.termination)
context = {'request': self.context['request']} context = {'request': self.context['request']}
return serializer(obj.termination, context=context).data return serializer(obj.termination, nested=True, context=context).data