mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-25 01:48:38 -06:00
Replace distinct annotations with subqueries for much better performance
This commit is contained in:
parent
a46b43bff6
commit
ad4d23fa20
@ -1,7 +1,7 @@
|
|||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db.models import Count, F
|
from django.db.models import Count, F, OuterRef, Subquery
|
||||||
from django.http import HttpResponseForbidden
|
from django.http import HttpResponseForbidden
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
@ -26,6 +26,7 @@ from extras.models import Graph, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_SITE
|
|||||||
from utilities.api import (
|
from utilities.api import (
|
||||||
get_serializer_for_model, IsAuthenticatedOrLoginNotRequired, FieldChoicesViewSet, ModelViewSet, ServiceUnavailable,
|
get_serializer_for_model, IsAuthenticatedOrLoginNotRequired, FieldChoicesViewSet, ModelViewSet, ServiceUnavailable,
|
||||||
)
|
)
|
||||||
|
from virtualization.models import VirtualMachine
|
||||||
from . import serializers
|
from . import serializers
|
||||||
from .exceptions import MissingFilterException
|
from .exceptions import MissingFilterException
|
||||||
|
|
||||||
@ -280,9 +281,15 @@ class DeviceBayTemplateViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class DeviceRoleViewSet(ModelViewSet):
|
class DeviceRoleViewSet(ModelViewSet):
|
||||||
|
device_count = Device.objects.filter(
|
||||||
|
device_role=OuterRef('pk')
|
||||||
|
).order_by().values('device_role').annotate(c=Count('*')).values('c')
|
||||||
|
virtualmachine_count = VirtualMachine.objects.filter(
|
||||||
|
role=OuterRef('pk')
|
||||||
|
).order_by().values('role').annotate(c=Count('*')).values('c')
|
||||||
queryset = DeviceRole.objects.annotate(
|
queryset = DeviceRole.objects.annotate(
|
||||||
device_count=Count('devices', distinct=True),
|
device_count=Subquery(device_count),
|
||||||
virtualmachine_count=Count('virtual_machines', distinct=True)
|
virtualmachine_count=Subquery(virtualmachine_count)
|
||||||
)
|
)
|
||||||
serializer_class = serializers.DeviceRoleSerializer
|
serializer_class = serializers.DeviceRoleSerializer
|
||||||
filterset_class = filters.DeviceRoleFilter
|
filterset_class = filters.DeviceRoleFilter
|
||||||
@ -293,9 +300,15 @@ class DeviceRoleViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class PlatformViewSet(ModelViewSet):
|
class PlatformViewSet(ModelViewSet):
|
||||||
|
device_count = Device.objects.filter(
|
||||||
|
platform=OuterRef('pk')
|
||||||
|
).order_by().values('platform').annotate(c=Count('*')).values('c')
|
||||||
|
virtualmachine_count = VirtualMachine.objects.filter(
|
||||||
|
platform=OuterRef('pk')
|
||||||
|
).order_by().values('platform').annotate(c=Count('*')).values('c')
|
||||||
queryset = Platform.objects.annotate(
|
queryset = Platform.objects.annotate(
|
||||||
device_count=Count('devices', distinct=True),
|
device_count=Subquery(device_count),
|
||||||
virtualmachine_count=Count('virtual_machines', distinct=True)
|
virtualmachine_count=Subquery(virtualmachine_count)
|
||||||
)
|
)
|
||||||
serializer_class = serializers.PlatformSerializer
|
serializer_class = serializers.PlatformSerializer
|
||||||
filterset_class = filters.PlatformFilter
|
filterset_class = filters.PlatformFilter
|
||||||
|
@ -66,9 +66,15 @@ class AggregateViewSet(CustomFieldModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class RoleViewSet(ModelViewSet):
|
class RoleViewSet(ModelViewSet):
|
||||||
|
prefix_count = Prefix.objects.filter(
|
||||||
|
role=OuterRef('pk')
|
||||||
|
).order_by().values('role').annotate(c=Count('*')).values('c')
|
||||||
|
vlan_count = VLAN.objects.filter(
|
||||||
|
role=OuterRef('pk')
|
||||||
|
).order_by().values('role').annotate(c=Count('*')).values('c')
|
||||||
queryset = Role.objects.annotate(
|
queryset = Role.objects.annotate(
|
||||||
prefix_count=Count('prefixes', distinct=True),
|
prefix_count=Subquery(prefix_count),
|
||||||
vlan_count=Count('vlans', distinct=True)
|
vlan_count=Subquery(vlan_count)
|
||||||
)
|
)
|
||||||
serializer_class = serializers.RoleSerializer
|
serializer_class = serializers.RoleSerializer
|
||||||
filterset_class = filters.RoleFilter
|
filterset_class = filters.RoleFilter
|
||||||
|
Loading…
Reference in New Issue
Block a user