Skip to content

Commit 145ee11

Browse files
authored
Fixes #19309: N+1 problem on /interfaces, /ip-addresses and /prefixes requests (#19304)
* Fixes N+1 problem on /interfaces, /ip-addresses and /prefixes requests * remove extra .all() * more prefetch for IPAddressViewSet
1 parent 94618a9 commit 145ee11

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

netbox/dcim/api/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ class InterfaceViewSet(PathEndpointMixin, NetBoxModelViewSet):
461461
Interface.objects.select_related("device", "cable"),
462462
],
463463
),
464+
'virtual_circuit_termination',
464465
'l2vpn_terminations', # Referenced by InterfaceSerializer.l2vpn_termination
465466
'ip_addresses', # Referenced by Interface.count_ipaddresses()
466467
'fhrp_group_assignments', # Referenced by Interface.count_fhrp_groups()

netbox/ipam/api/views.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from copy import deepcopy
22

3+
from django.contrib.contenttypes.prefetch import GenericPrefetch
34
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
45
from django.db import transaction
56
from django.shortcuts import get_object_or_404
@@ -13,6 +14,7 @@
1314
from rest_framework.routers import APIRootView
1415
from rest_framework.views import APIView
1516

17+
from dcim.models import Interface
1618
from ipam import filtersets
1719
from ipam.models import *
1820
from ipam.utils import get_next_available_prefix
@@ -21,6 +23,7 @@
2123
from netbox.config import get_config
2224
from netbox.constants import ADVISORY_LOCK_KEYS
2325
from utilities.api import get_serializer_for_model
26+
from virtualization.models import VMInterface
2427
from . import serializers
2528

2629

@@ -79,7 +82,7 @@ class RoleViewSet(NetBoxModelViewSet):
7982

8083

8184
class PrefixViewSet(NetBoxModelViewSet):
82-
queryset = Prefix.objects.all()
85+
queryset = Prefix.objects.prefetch_related("scope")
8386
serializer_class = serializers.PrefixSerializer
8487
filterset_class = filtersets.PrefixFilterSet
8588

@@ -100,7 +103,17 @@ class IPRangeViewSet(NetBoxModelViewSet):
100103

101104

102105
class IPAddressViewSet(NetBoxModelViewSet):
103-
queryset = IPAddress.objects.all()
106+
queryset = IPAddress.objects.prefetch_related(
107+
GenericPrefetch(
108+
"assigned_object",
109+
[
110+
# serializers are taken according to IPADDRESS_ASSIGNMENT_MODELS
111+
FHRPGroup.objects.all(),
112+
Interface.objects.select_related("cable", "device"),
113+
VMInterface.objects.select_related("virtual_machine"),
114+
],
115+
),
116+
)
104117
serializer_class = serializers.IPAddressSerializer
105118
filterset_class = filtersets.IPAddressFilterSet
106119

0 commit comments

Comments
 (0)