From ea5696e700157ac557c59446e38e0f420a93b7ef Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 25 Nov 2020 14:10:53 -0500 Subject: [PATCH] Convert ipam to use subqueries --- netbox/ipam/api/views.py | 7 +++---- netbox/ipam/views.py | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index c296fd912..8377f562c 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -1,5 +1,4 @@ from django.conf import settings -from django.db.models import Count from django.shortcuts import get_object_or_404 from django_pglocks import advisory_lock from drf_yasg.utils import swagger_auto_schema @@ -44,8 +43,8 @@ class VRFViewSet(CustomFieldModelViewSet): class RIRViewSet(ModelViewSet): queryset = RIR.objects.annotate( - aggregate_count=Count('aggregates') - ).order_by(*RIR._meta.ordering) + aggregate_count=get_subquery(Aggregate, 'rir') + ) serializer_class = serializers.RIRSerializer filterset_class = filters.RIRFilterSet @@ -261,7 +260,7 @@ class IPAddressViewSet(CustomFieldModelViewSet): class VLANGroupViewSet(ModelViewSet): queryset = VLANGroup.objects.prefetch_related('site').annotate( - vlan_count=Count('vlans') + vlan_count=get_subquery(VLAN, 'group') ).order_by(*VLANGroup._meta.ordering) serializer_class = serializers.VLANGroupSerializer filterset_class = filters.VLANGroupFilterSet diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 5ed2478ba..7fe0a6353 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1,6 +1,5 @@ import netaddr -from django.conf import settings -from django.db.models import Count, Prefetch +from django.db.models import Prefetch from django.db.models.expressions import RawSQL from django.shortcuts import get_object_or_404, redirect, render from django_tables2 import RequestConfig @@ -79,7 +78,9 @@ class VRFBulkDeleteView(BulkDeleteView): # class RIRListView(ObjectListView): - queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')).order_by(*RIR._meta.ordering) + queryset = RIR.objects.annotate( + aggregate_count=get_subquery(Aggregate, 'rir') + ) filterset = filters.RIRFilterSet filterset_form = forms.RIRFilterForm table = tables.RIRDetailTable @@ -172,7 +173,9 @@ class RIRBulkImportView(BulkImportView): class RIRBulkDeleteView(BulkDeleteView): - queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')).order_by(*RIR._meta.ordering) + queryset = RIR.objects.annotate( + aggregate_count=get_subquery(Aggregate, 'rir') + ) filterset = filters.RIRFilterSet table = tables.RIRTable @@ -652,8 +655,8 @@ class IPAddressBulkDeleteView(BulkDeleteView): class VLANGroupListView(ObjectListView): queryset = VLANGroup.objects.prefetch_related('site').annotate( - vlan_count=Count('vlans') - ).order_by(*VLANGroup._meta.ordering) + vlan_count=get_subquery(VLAN, 'group') + ) filterset = filters.VLANGroupFilterSet filterset_form = forms.VLANGroupFilterForm table = tables.VLANGroupTable @@ -676,8 +679,8 @@ class VLANGroupBulkImportView(BulkImportView): class VLANGroupBulkDeleteView(BulkDeleteView): queryset = VLANGroup.objects.prefetch_related('site').annotate( - vlan_count=Count('vlans') - ).order_by(*VLANGroup._meta.ordering) + vlan_count=get_subquery(VLAN, 'group') + ) filterset = filters.VLANGroupFilterSet table = tables.VLANGroupTable