diff --git a/netbox/circuits/api/nested_serializers.py b/netbox/circuits/api/nested_serializers.py index 034970124..36254dc8b 100644 --- a/netbox/circuits/api/nested_serializers.py +++ b/netbox/circuits/api/nested_serializers.py @@ -36,7 +36,7 @@ class NestedProviderNetworkSerializer(WritableNestedSerializer): ) class NestedProviderSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') - circuit_count = RelatedObjectCountField('circuits.circuit', 'provider') + circuit_count = RelatedObjectCountField('circuits') class Meta: model = Provider @@ -64,7 +64,7 @@ class NestedProviderAccountSerializer(WritableNestedSerializer): ) class NestedCircuitTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') - circuit_count = RelatedObjectCountField('circuits.circuit', 'type') + circuit_count = RelatedObjectCountField('circuits') class Meta: model = CircuitType diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index f4aba713e..4f88b9b28 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -32,7 +32,7 @@ class ProviderSerializer(NetBoxModelSerializer): ) # Related object counts - circuit_count = RelatedObjectCountField('circuits.circuit', 'provider') + circuit_count = RelatedObjectCountField('circuits') class Meta: model = Provider @@ -82,7 +82,7 @@ class CircuitTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') # Related object counts - circuit_count = RelatedObjectCountField('circuits.circuit', 'type') + circuit_count = RelatedObjectCountField('circuits') class Meta: model = CircuitType diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 93b5ce98a..d685ba43d 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -28,7 +28,7 @@ class DataSourceSerializer(NetBoxModelSerializer): ) # Related object counts - file_count = RelatedObjectCountField('core.datafile', 'source') + file_count = RelatedObjectCountField('datafiles') class Meta: model = DataSource diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index 0fc5cedac..9a59af8e2 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -111,7 +111,7 @@ class NestedLocationSerializer(WritableNestedSerializer): ) class NestedRackRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') - rack_count = RelatedObjectCountField('dcim.rack', 'role') + rack_count = RelatedObjectCountField('racks') class Meta: model = models.RackRole @@ -123,7 +123,7 @@ class NestedRackRoleSerializer(WritableNestedSerializer): ) class NestedRackSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') - device_count = RelatedObjectCountField('dcim.device', 'rack') + device_count = RelatedObjectCountField('devices') class Meta: model = models.Rack @@ -151,7 +151,7 @@ class NestedRackReservationSerializer(WritableNestedSerializer): ) class NestedManufacturerSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') - devicetype_count = RelatedObjectCountField('dcim.devicetype', 'manufacturer') + devicetype_count = RelatedObjectCountField('device_types') class Meta: model = models.Manufacturer @@ -164,7 +164,7 @@ class NestedManufacturerSerializer(WritableNestedSerializer): class NestedDeviceTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') manufacturer = NestedManufacturerSerializer(read_only=True) - device_count = RelatedObjectCountField('dcim.device', 'device_type') + device_count = RelatedObjectCountField('instances') class Meta: model = models.DeviceType @@ -274,8 +274,8 @@ class NestedInventoryItemTemplateSerializer(WritableNestedSerializer): ) class NestedDeviceRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') - device_count = RelatedObjectCountField('dcim.device', 'role') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'role') + device_count = RelatedObjectCountField('devices') + virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = models.DeviceRole @@ -287,8 +287,8 @@ class NestedDeviceRoleSerializer(WritableNestedSerializer): ) class NestedPlatformSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') - device_count = RelatedObjectCountField('dcim.device', 'platform') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'platform') + device_count = RelatedObjectCountField('devices') + virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = models.Platform @@ -445,7 +445,7 @@ class NestedInventoryItemSerializer(WritableNestedSerializer): ) class NestedInventoryItemRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') - inventoryitem_count = RelatedObjectCountField('dcim.inventoryitem', 'role') + inventoryitem_count = RelatedObjectCountField('inventory_items') class Meta: model = models.InventoryItemRole @@ -490,7 +490,7 @@ class NestedVirtualChassisSerializer(WritableNestedSerializer): ) class NestedPowerPanelSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') - powerfeed_count = RelatedObjectCountField('dcim.powerfeed', 'power_panel') + powerfeed_count = RelatedObjectCountField('powerfeeds') class Meta: model = models.PowerPanel diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index af3dfee6a..e4c51a476 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -144,12 +144,12 @@ class SiteSerializer(NetBoxModelSerializer): ) # Related object counts - circuit_count = RelatedObjectCountField('circuits.circuit', 'terminations__site') - device_count = RelatedObjectCountField('dcim.device', 'site') - prefix_count = RelatedObjectCountField('ipam.prefix', 'site') - rack_count = RelatedObjectCountField('dcim.rack', 'site') - vlan_count = RelatedObjectCountField('ipam.vlan', 'site') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'site') + circuit_count = RelatedObjectCountField('circuit_terminations') + device_count = RelatedObjectCountField('devices') + prefix_count = RelatedObjectCountField('prefixes') + rack_count = RelatedObjectCountField('racks') + vlan_count = RelatedObjectCountField('vlans') + virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = Site @@ -186,7 +186,7 @@ class RackRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') # Related object counts - rack_count = RelatedObjectCountField('dcim.rack', 'role') + rack_count = RelatedObjectCountField('racks') class Meta: model = RackRole @@ -211,8 +211,8 @@ class RackSerializer(NetBoxModelSerializer): weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True) # Related object counts - device_count = RelatedObjectCountField('dcim.device', 'rack') - powerfeed_count = RelatedObjectCountField('dcim.powerfeed', 'rack') + device_count = RelatedObjectCountField('devices') + powerfeed_count = RelatedObjectCountField('powerfeeds') class Meta: model = Rack @@ -305,9 +305,9 @@ class ManufacturerSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') # Related object counts - devicetype_count = RelatedObjectCountField('dcim.devicetype', 'manufacturer') - inventoryitem_count = RelatedObjectCountField('dcim.inventoryitem', 'manufacturer') - platform_count = RelatedObjectCountField('dcim.platform', 'manufacturer') + devicetype_count = RelatedObjectCountField('device_types') + inventoryitem_count = RelatedObjectCountField('inventory_items') + platform_count = RelatedObjectCountField('platforms') class Meta: model = Manufacturer @@ -345,7 +345,7 @@ class DeviceTypeSerializer(NetBoxModelSerializer): inventory_item_template_count = serializers.IntegerField(read_only=True) # Related object counts - device_count = RelatedObjectCountField('dcim.device', 'device_type') + device_count = RelatedObjectCountField('instances') class Meta: model = DeviceType @@ -646,8 +646,8 @@ class DeviceRoleSerializer(NetBoxModelSerializer): config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None) # Related object counts - device_count = RelatedObjectCountField('dcim.device', 'role') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'role') + device_count = RelatedObjectCountField('devices') + virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = DeviceRole @@ -663,8 +663,8 @@ class PlatformSerializer(NetBoxModelSerializer): config_template = NestedConfigTemplateSerializer(required=False, allow_null=True, default=None) # Related object counts - device_count = RelatedObjectCountField('dcim.device', 'platform') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'platform') + device_count = RelatedObjectCountField('devices') + virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = Platform @@ -773,7 +773,7 @@ class VirtualDeviceContextSerializer(NetBoxModelSerializer): status = ChoiceField(choices=VirtualDeviceContextStatusChoices) # Related object counts - interface_count = RelatedObjectCountField('dcim.interface', 'vdcs') + interface_count = RelatedObjectCountField('interfaces') class Meta: model = VirtualDeviceContext @@ -1106,7 +1106,7 @@ class InventoryItemRoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') # Related object counts - inventoryitem_count = RelatedObjectCountField('dcim.inventoryitem', 'role') + inventoryitem_count = RelatedObjectCountField('inventory_items') class Meta: model = InventoryItemRole @@ -1220,7 +1220,7 @@ class PowerPanelSerializer(NetBoxModelSerializer): ) # Related object counts - powerfeed_count = RelatedObjectCountField('dcim.powerfeed', 'power_panel') + powerfeed_count = RelatedObjectCountField('powerfeeds') class Meta: model = PowerPanel diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 04333c084..ea1a2e3d1 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -7,6 +7,7 @@ from rest_framework.response import Response from rest_framework.routers import APIRootView from rest_framework.viewsets import ViewSet +from circuits.models import Circuit from dcim import filtersets from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH from dcim.models import * @@ -20,6 +21,7 @@ from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from netbox.constants import NESTED_SERIALIZER_PREFIX from utilities.api import get_serializer_for_model from utilities.query_functions import CollateAsChar +from utilities.utils import count_related from . import serializers from .exceptions import MissingFilterException diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 60e806e9b..40b73f902 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -289,7 +289,7 @@ class TagSerializer(ValidatedModelSerializer): ) # Related object counts - tagged_items = RelatedObjectCountField('extras.taggeditem', 'tag') + tagged_items = RelatedObjectCountField('extras_taggeditem_items') class Meta: model = Tag diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 156f8897e..4d4a77bef 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -59,7 +59,7 @@ class NestedASNSerializer(WritableNestedSerializer): ) class NestedVRFSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') - prefix_count = RelatedObjectCountField('ipam.prefix', 'vrf') + prefix_count = RelatedObjectCountField('prefixes') class Meta: model = models.VRF @@ -87,7 +87,7 @@ class NestedRouteTargetSerializer(WritableNestedSerializer): ) class NestedRIRSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') - aggregate_count = RelatedObjectCountField('ipam.aggregate', 'rir') + aggregate_count = RelatedObjectCountField('aggregates') class Meta: model = models.RIR @@ -133,8 +133,8 @@ class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer): ) class NestedRoleSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') - prefix_count = RelatedObjectCountField('ipam.prefix', 'role') - vlan_count = RelatedObjectCountField('ipam.vlan', 'role') + prefix_count = RelatedObjectCountField('prefixes') + vlan_count = RelatedObjectCountField('vlans') class Meta: model = models.Role @@ -146,7 +146,7 @@ class NestedRoleSerializer(WritableNestedSerializer): ) class NestedVLANGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') - vlan_count = RelatedObjectCountField('ipam.vlan', 'group') + vlan_count = RelatedObjectCountField('vlans') class Meta: model = models.VLANGroup diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 76a323c38..eedb19915 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -45,8 +45,8 @@ class ASNSerializer(NetBoxModelSerializer): tenant = NestedTenantSerializer(required=False, allow_null=True) # Related object counts - site_count = RelatedObjectCountField('dcim.site', 'asns') - provider_count = RelatedObjectCountField('circuits.provider', 'asns') + site_count = RelatedObjectCountField('sites') + provider_count = RelatedObjectCountField('providers') class Meta: model = ASN @@ -94,8 +94,8 @@ class VRFSerializer(NetBoxModelSerializer): ) # Related object counts - ipaddress_count = RelatedObjectCountField('ipam.ipaddress', 'vrf') - prefix_count = RelatedObjectCountField('ipam.prefix', 'vrf') + ipaddress_count = RelatedObjectCountField('ip_addresses') + prefix_count = RelatedObjectCountField('prefixes') class Meta: model = VRF @@ -130,7 +130,7 @@ class RIRSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') # Related object counts - aggregate_count = RelatedObjectCountField('ipam.aggregate', 'rir') + aggregate_count = RelatedObjectCountField('aggregates') class Meta: model = RIR @@ -203,8 +203,8 @@ class RoleSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') # Related object counts - prefix_count = RelatedObjectCountField('ipam.prefix', 'role') - vlan_count = RelatedObjectCountField('ipam.vlan', 'role') + prefix_count = RelatedObjectCountField('prefixes') + vlan_count = RelatedObjectCountField('vlans') class Meta: model = Role @@ -229,7 +229,7 @@ class VLANGroupSerializer(NetBoxModelSerializer): utilization = serializers.CharField(read_only=True) # Related object counts - vlan_count = RelatedObjectCountField('ipam.vlan', 'group') + vlan_count = RelatedObjectCountField('vlans') class Meta: model = VLANGroup @@ -259,7 +259,7 @@ class VLANSerializer(NetBoxModelSerializer): l2vpn_termination = NestedL2VPNTerminationSerializer(read_only=True, allow_null=True) # Related object counts - prefix_count = RelatedObjectCountField('ipam.prefix', 'vlan') + prefix_count = RelatedObjectCountField('prefixes') class Meta: model = VLAN diff --git a/netbox/netbox/api/fields.py b/netbox/netbox/api/fields.py index 45ed3d443..ae0621c46 100644 --- a/netbox/netbox/api/fields.py +++ b/netbox/netbox/api/fields.py @@ -1,7 +1,6 @@ -from django.apps import apps from django.core.exceptions import ObjectDoesNotExist -from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema_field from netaddr import IPNetwork from rest_framework import serializers from rest_framework.exceptions import ValidationError @@ -146,13 +145,7 @@ class RelatedObjectCountField(serializers.ReadOnlyField): is detected by get_annotations_for_serializer() when determining the annotations to be added to a queryset depending on the serializer fields selected for inclusion in the response. """ - def __init__(self, model, related_field, **kwargs): - super().__init__(**kwargs) + def __init__(self, relation, **kwargs): + self.relation = relation - # Set the model and field names passed on the field - if type(model) is str: - app_label, model_name = model.split('.') - self.model = apps.get_model(app_label, model_name) - else: - self.model = model - self.related_field = related_field + super().__init__(**kwargs) diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py index 48d018742..ce16f2523 100644 --- a/netbox/tenancy/api/serializers.py +++ b/netbox/tenancy/api/serializers.py @@ -34,16 +34,16 @@ class TenantSerializer(NetBoxModelSerializer): group = NestedTenantGroupSerializer(required=False, allow_null=True) # Related object counts - circuit_count = RelatedObjectCountField('circuits.circuit', 'tenant') - device_count = RelatedObjectCountField('dcim.device', 'tenant') - rack_count = RelatedObjectCountField('dcim.rack', 'tenant') - site_count = RelatedObjectCountField('dcim.site', 'tenant') - ipaddress_count = RelatedObjectCountField('ipam.ipaddress', 'tenant') - prefix_count = RelatedObjectCountField('ipam.prefix', 'tenant') - vlan_count = RelatedObjectCountField('ipam.vlan', 'tenant') - vrf_count = RelatedObjectCountField('ipam.vrf', 'tenant') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'tenant') - cluster_count = RelatedObjectCountField('virtualization.cluster', 'tenant') + circuit_count = RelatedObjectCountField('circuits') + device_count = RelatedObjectCountField('devices') + rack_count = RelatedObjectCountField('racks') + site_count = RelatedObjectCountField('sites') + ipaddress_count = RelatedObjectCountField('ip_addresses') + prefix_count = RelatedObjectCountField('prefixes') + vlan_count = RelatedObjectCountField('vlans') + vrf_count = RelatedObjectCountField('vrfs') + virtualmachine_count = RelatedObjectCountField('virtual_machines') + cluster_count = RelatedObjectCountField('clusters') class Meta: model = Tenant diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py index dc8429dbb..a13e62bfd 100644 --- a/netbox/utilities/api.py +++ b/netbox/utilities/api.py @@ -17,6 +17,7 @@ from utilities.utils import count_related from .utils import dynamic_import __all__ = ( + 'get_annotations_for_serializer', 'get_graphql_type_for_model', 'get_prefetches_for_serializer', 'get_serializer_for_model', @@ -143,9 +144,12 @@ def get_annotations_for_serializer(serializer_class, fields_to_include=None): if not fields_to_include: fields_to_include = serializer_class.Meta.fields + model = serializer_class.Meta.model + for field_name, field in serializer_class._declared_fields.items(): if field_name in fields_to_include and type(field) is RelatedObjectCountField: - annotations[field_name] = count_related(field.model, field.related_field) + related_field = model._meta.get_field(field.relation).field + annotations[field_name] = count_related(related_field.model, related_field.name) return annotations diff --git a/netbox/virtualization/api/nested_serializers.py b/netbox/virtualization/api/nested_serializers.py index 620df31d2..0c7a10918 100644 --- a/netbox/virtualization/api/nested_serializers.py +++ b/netbox/virtualization/api/nested_serializers.py @@ -24,7 +24,7 @@ __all__ = [ ) class NestedClusterTypeSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') - cluster_count = RelatedObjectCountField('virtualization.cluster', 'type') + cluster_count = RelatedObjectCountField('clusters') class Meta: model = ClusterType @@ -36,7 +36,7 @@ class NestedClusterTypeSerializer(WritableNestedSerializer): ) class NestedClusterGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') - cluster_count = RelatedObjectCountField('virtualization.cluster', 'group') + cluster_count = RelatedObjectCountField('clusters') class Meta: model = ClusterGroup @@ -48,7 +48,7 @@ class NestedClusterGroupSerializer(WritableNestedSerializer): ) class NestedClusterSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'cluster') + virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = Cluster diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 991bcd714..5bfec1dd6 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -25,7 +25,7 @@ class ClusterTypeSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail') # Related object counts - cluster_count = RelatedObjectCountField('virtualization.cluster', 'type') + cluster_count = RelatedObjectCountField('clusters') class Meta: model = ClusterType @@ -39,7 +39,7 @@ class ClusterGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail') # Related object counts - cluster_count = RelatedObjectCountField('virtualization.cluster', 'group') + cluster_count = RelatedObjectCountField('clusters') class Meta: model = ClusterGroup @@ -58,8 +58,8 @@ class ClusterSerializer(NetBoxModelSerializer): site = NestedSiteSerializer(required=False, allow_null=True, default=None) # Related object counts - device_count = RelatedObjectCountField('dcim.device', 'cluster') - virtualmachine_count = RelatedObjectCountField('virtualization.virtualmachine', 'cluster') + device_count = RelatedObjectCountField('devices') + virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = Cluster diff --git a/netbox/vpn/api/nested_serializers.py b/netbox/vpn/api/nested_serializers.py index 74f9f94b8..c91dcb40a 100644 --- a/netbox/vpn/api/nested_serializers.py +++ b/netbox/vpn/api/nested_serializers.py @@ -24,7 +24,7 @@ __all__ = ( ) class NestedTunnelGroupSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') - tunnel_count = RelatedObjectCountField('vpn.tunnel', 'group') + tunnel_count = RelatedObjectCountField('tunnels') class Meta: model = models.TunnelGroup diff --git a/netbox/vpn/api/serializers.py b/netbox/vpn/api/serializers.py index cba83d4ed..a1f5995a4 100644 --- a/netbox/vpn/api/serializers.py +++ b/netbox/vpn/api/serializers.py @@ -31,7 +31,7 @@ class TunnelGroupSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') # Related object counts - tunnel_count = RelatedObjectCountField('vpn.tunnel', 'group') + tunnel_count = RelatedObjectCountField('tunnels') class Meta: model = TunnelGroup @@ -62,7 +62,7 @@ class TunnelSerializer(NetBoxModelSerializer): ) # Related object counts - terminations_count = RelatedObjectCountField('vpn.tunneltermination', 'tunnel') + terminations_count = RelatedObjectCountField('terminations') class Meta: model = Tunnel