diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 5bdb39ae9..8fe51a075 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -382,7 +382,7 @@ class InterfaceNestedSerializer(InterfaceSerializer): class InterfaceDetailSerializer(InterfaceSerializer): - connected_interface = InterfaceSerializer(source='get_connected_interface') + connected_interface = InterfaceSerializer() class Meta(InterfaceSerializer.Meta): fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected', diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 8b598339f..53bda6208 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -455,7 +455,7 @@ class RelatedConnectionsView(APIView): peer_iface = Interface.objects.get(device__name=peer_device, name=peer_interface) except Interface.DoesNotExist: raise Http404() - local_iface = peer_iface.get_connected_interface() + local_iface = peer_iface.connected_interface if local_iface: device = local_iface.device else: diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 15a01a2fd..1ec8162b7 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1156,13 +1156,18 @@ class Interface(models.Model): pass return None - def get_connected_interface(self): - connection = InterfaceConnection.objects.select_related().filter(Q(interface_a=self) | Q(interface_b=self))\ - .first() - if connection and connection.interface_a == self: - return connection.interface_b - elif connection: - return connection.interface_a + @property + def connected_interface(self): + try: + if self.connected_as_a: + return self.connected_as_a.interface_b + except ObjectDoesNotExist: + pass + try: + if self.connected_as_b: + return self.connected_as_b.interface_a + except ObjectDoesNotExist: + pass return None diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 0fbc73855..58c38bfb0 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -597,10 +597,16 @@ def device(request, pk): power_outlets = natsorted( PowerOutlet.objects.filter(device=device).select_related('connected_port'), key=attrgetter('name') ) - interfaces = Interface.objects.filter(device=device, mgmt_only=False)\ - .select_related('connected_as_a', 'connected_as_b', 'circuit_termination__circuit') - mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True)\ - .select_related('connected_as_a', 'connected_as_b', 'circuit_termination__circuit') + interfaces = Interface.objects.filter(device=device, mgmt_only=False).select_related( + 'connected_as_a__interface_b__device', + 'connected_as_b__interface_a__device', + 'circuit_termination__circuit', + ) + mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True).select_related( + 'connected_as_a__interface_b__device', + 'connected_as_b__interface_a__device', + 'circuit_termination__circuit', + ) device_bays = natsorted( DeviceBay.objects.filter(device=device).select_related('installed_device__device_type__manufacturer'), key=attrgetter('name') diff --git a/netbox/templates/dcim/device_lldp_neighbors.html b/netbox/templates/dcim/device_lldp_neighbors.html index b37f1860e..415456a29 100644 --- a/netbox/templates/dcim/device_lldp_neighbors.html +++ b/netbox/templates/dcim/device_lldp_neighbors.html @@ -23,7 +23,7 @@