From 797074ad9f59bf22c485af7ac6b02e90fb001ab6 Mon Sep 17 00:00:00 2001 From: Armin Fisslthaler Date: Mon, 25 Sep 2017 13:47:55 +0200 Subject: [PATCH 1/3] Reduce the number of SQL queries made in API calls This is done by adding missing tables/colums to the prefetch querysets. --- netbox/dcim/api/views.py | 14 ++++++++++++-- netbox/extras/api/views.py | 2 +- netbox/ipam/api/views.py | 14 +++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 56d4221da..4c1cb0926 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -83,7 +83,7 @@ class RackRoleViewSet(ModelViewSet): # class RackViewSet(WritableSerializerMixin, CustomFieldModelViewSet): - queryset = Rack.objects.select_related('site', 'group__site', 'tenant') + queryset = Rack.objects.select_related('site', 'group__site', 'tenant', 'rackrole') serializer_class = serializers.RackSerializer write_serializer_class = serializers.WritableRackSerializer filter_class = filters.RackFilter @@ -219,6 +219,7 @@ class DeviceViewSet(WritableSerializerMixin, CustomFieldModelViewSet): queryset = Device.objects.select_related( 'device_type__manufacturer', 'device_role', 'tenant', 'platform', 'site', 'rack', 'parent_bay', ).prefetch_related( + 'primary_ip4', 'primary_ip6', 'primary_ip4__nat_outside', 'primary_ip6__nat_outside', ) serializer_class = serializers.DeviceSerializer @@ -320,7 +321,16 @@ class PowerOutletViewSet(WritableSerializerMixin, ModelViewSet): class InterfaceViewSet(WritableSerializerMixin, ModelViewSet): - queryset = Interface.objects.select_related('device') + queryset = Interface.objects.select_related( + 'circuit_termination__circuit', + 'circuit_termination__interface', + 'connected_as_a__interface_b', + 'connected_as_a__interface_b__device', + 'connected_as_b__interface_a', + 'connected_as_b__interface_a__device', + 'device', + 'lag', + ) serializer_class = serializers.InterfaceSerializer write_serializer_class = serializers.WritableInterfaceSerializer filter_class = filters.InterfaceFilter diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index 37112f2c6..7621142b9 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -92,6 +92,6 @@ class RecentActivityViewSet(ReadOnlyModelViewSet): """ List all UserActions to provide a log of recent activity. """ - queryset = UserAction.objects.all() + queryset = UserAction.objects.select_related('user') serializer_class = serializers.UserActionSerializer filter_class = filters.UserActionFilter diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index abff09c15..bc0ea5bba 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -134,7 +134,19 @@ class PrefixViewSet(WritableSerializerMixin, CustomFieldModelViewSet): # class IPAddressViewSet(WritableSerializerMixin, CustomFieldModelViewSet): - queryset = IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device', 'nat_inside') + queryset = IPAddress.objects.select_related( + 'interface', + 'interface__circuit_termination', + 'interface__connected_as_a__interface_b', + 'interface__connected_as_a__interface_b__device', + 'interface__connected_as_b__interface_a', + 'interface__connected_as_b__interface_a__device', + 'interface__device', + 'nat_inside', + 'nat_outside', + 'tenant', + 'vrf__tenant', + ) serializer_class = serializers.IPAddressSerializer write_serializer_class = serializers.WritableIPAddressSerializer filter_class = filters.IPAddressFilter From 5c3b1645068520e5ba8054875ed548f9caeceeb5 Mon Sep 17 00:00:00 2001 From: Armin Fisslthaler Date: Mon, 25 Sep 2017 14:15:30 +0200 Subject: [PATCH 2/3] Fix field name --- netbox/dcim/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 4c1cb0926..b5dc65a07 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -83,7 +83,7 @@ class RackRoleViewSet(ModelViewSet): # class RackViewSet(WritableSerializerMixin, CustomFieldModelViewSet): - queryset = Rack.objects.select_related('site', 'group__site', 'tenant', 'rackrole') + queryset = Rack.objects.select_related('site', 'group__site', 'tenant', 'role') serializer_class = serializers.RackSerializer write_serializer_class = serializers.WritableRackSerializer filter_class = filters.RackFilter From d1fdfc93433f0feb1a6a1bab91602467ea6c3859 Mon Sep 17 00:00:00 2001 From: Armin Fisslthaler Date: Mon, 25 Sep 2017 14:16:52 +0200 Subject: [PATCH 3/3] Style fixes --- netbox/dcim/api/views.py | 17 ++++++++--------- netbox/ipam/api/views.py | 23 +++++++++++------------ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index b5dc65a07..4d8154936 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -322,15 +322,14 @@ class PowerOutletViewSet(WritableSerializerMixin, ModelViewSet): class InterfaceViewSet(WritableSerializerMixin, ModelViewSet): queryset = Interface.objects.select_related( - 'circuit_termination__circuit', - 'circuit_termination__interface', - 'connected_as_a__interface_b', - 'connected_as_a__interface_b__device', - 'connected_as_b__interface_a', - 'connected_as_b__interface_a__device', - 'device', - 'lag', - ) + 'circuit_termination__circuit', + 'circuit_termination__interface', + 'connected_as_a__interface_b', + 'connected_as_a__interface_b__device', + 'connected_as_b__interface_a', + 'connected_as_b__interface_a__device', + 'device', + 'lag') serializer_class = serializers.InterfaceSerializer write_serializer_class = serializers.WritableInterfaceSerializer filter_class = filters.InterfaceFilter diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index bc0ea5bba..bcde765c5 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -135,18 +135,17 @@ class PrefixViewSet(WritableSerializerMixin, CustomFieldModelViewSet): class IPAddressViewSet(WritableSerializerMixin, CustomFieldModelViewSet): queryset = IPAddress.objects.select_related( - 'interface', - 'interface__circuit_termination', - 'interface__connected_as_a__interface_b', - 'interface__connected_as_a__interface_b__device', - 'interface__connected_as_b__interface_a', - 'interface__connected_as_b__interface_a__device', - 'interface__device', - 'nat_inside', - 'nat_outside', - 'tenant', - 'vrf__tenant', - ) + 'interface', + 'interface__circuit_termination', + 'interface__connected_as_a__interface_b', + 'interface__connected_as_a__interface_b__device', + 'interface__connected_as_b__interface_a', + 'interface__connected_as_b__interface_a__device', + 'interface__device', + 'nat_inside', + 'nat_outside', + 'tenant', + 'vrf__tenant') serializer_class = serializers.IPAddressSerializer write_serializer_class = serializers.WritableIPAddressSerializer filter_class = filters.IPAddressFilter