From d991e8d0079f581ce1afe25e1ab1ab7b9c96165f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 25 Nov 2020 14:06:32 -0500 Subject: [PATCH] Convert extras to use subqueries --- netbox/circuits/api/views.py | 2 +- netbox/circuits/views.py | 1 - netbox/dcim/api/views.py | 2 +- netbox/dcim/views.py | 2 +- netbox/extras/api/views.py | 7 +++---- netbox/extras/views.py | 18 +++++++++--------- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index dbb2b29b1..32adc66ae 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -1,4 +1,4 @@ -from django.db.models import Count, Prefetch +from django.db.models import Prefetch from django.shortcuts import get_object_or_404 from rest_framework.decorators import action from rest_framework.response import Response diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 22c753123..2722bda67 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -1,6 +1,5 @@ from django.contrib import messages from django.db import transaction -from django.db.models import Count from django.shortcuts import get_object_or_404, redirect, render from django_tables2 import RequestConfig diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 89934cf4c..7afd3e0a6 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -2,7 +2,7 @@ import socket from collections import OrderedDict from django.conf import settings -from django.db.models import Count, F +from django.db.models import F from django.http import HttpResponseForbidden, HttpResponse from django.shortcuts import get_object_or_404 from drf_yasg import openapi diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 44a2d2359..200581f4a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -4,7 +4,7 @@ from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.core.paginator import EmptyPage, PageNotAnInteger from django.db import transaction -from django.db.models import Count, F, Prefetch +from django.db.models import F, Prefetch from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, modelformset_factory from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index 74c9ea889..7383d6a7a 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -1,7 +1,6 @@ from collections import OrderedDict from django.contrib.contenttypes.models import ContentType -from django.db.models import Count from django.http import Http404 from django_rq.queues import get_connection from rest_framework import status @@ -15,14 +14,14 @@ from rq import Worker from extras import filters from extras.choices import JobResultStatusChoices from extras.models import ( - ConfigContext, CustomFieldChoice, ExportTemplate, Graph, ImageAttachment, ObjectChange, JobResult, Tag, + ConfigContext, CustomFieldChoice, ExportTemplate, Graph, ImageAttachment, ObjectChange, JobResult, Tag, TaggedItem, ) from extras.reports import get_report, get_reports, run_report from extras.scripts import get_script, get_scripts, run_script from utilities.api import IsAuthenticatedOrLoginNotRequired, ModelViewSet from utilities.exceptions import RQWorkerNotRunningException from utilities.metadata import ContentTypeMetadata -from utilities.utils import copy_safe_request +from utilities.utils import copy_safe_request, get_subquery from . import serializers @@ -149,7 +148,7 @@ class ExportTemplateViewSet(ModelViewSet): class TagViewSet(ModelViewSet): queryset = Tag.objects.annotate( - tagged_items=Count('extras_taggeditem_items') + tagged_items=get_subquery(TaggedItem, 'tag') ).order_by(*Tag._meta.ordering) serializer_class = serializers.TagSerializer filterset_class = filters.TagFilterSet diff --git a/netbox/extras/views.py b/netbox/extras/views.py index f2c31652c..4aa2969df 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1,7 +1,7 @@ from django import template from django.contrib import messages from django.contrib.contenttypes.models import ContentType -from django.db.models import Count, Prefetch, Q +from django.db.models import Prefetch, Q from django.http import Http404, HttpResponseForbidden from django.shortcuts import get_object_or_404, redirect, render from django.views.generic import View @@ -13,7 +13,7 @@ from dcim.models import DeviceRole, Platform, Region, Site from tenancy.models import Tenant, TenantGroup from utilities.forms import ConfirmationForm from utilities.paginator import EnhancedPaginator, get_paginate_count -from utilities.utils import copy_safe_request, shallow_compare_dict +from utilities.utils import copy_safe_request, get_subquery, shallow_compare_dict from utilities.views import ( BulkDeleteView, BulkEditView, BulkImportView, ObjectView, ObjectDeleteView, ObjectEditView, ObjectListView, ContentTypePermissionRequiredMixin, @@ -21,7 +21,7 @@ from utilities.views import ( from virtualization.models import Cluster, ClusterGroup from . import filters, forms, tables from .choices import JobResultStatusChoices -from .models import ConfigContext, ImageAttachment, ObjectChange, JobResult, Tag +from .models import ConfigContext, ImageAttachment, ObjectChange, JobResult, Tag, TaggedItem from .reports import get_report, get_reports, run_report from .scripts import get_scripts, run_script @@ -32,8 +32,8 @@ from .scripts import get_scripts, run_script class TagListView(ObjectListView): queryset = Tag.objects.annotate( - items=Count('extras_taggeditem_items') - ).order_by(*Tag._meta.ordering) + items=get_subquery(TaggedItem, 'tag') + ) filterset = filters.TagFilterSet filterset_form = forms.TagFilterForm table = tables.TagTable @@ -57,16 +57,16 @@ class TagBulkImportView(BulkImportView): class TagBulkEditView(BulkEditView): queryset = Tag.objects.annotate( - items=Count('extras_taggeditem_items') - ).order_by(*Tag._meta.ordering) + items=get_subquery(TaggedItem, 'tag') + ) table = tables.TagTable form = forms.TagBulkEditForm class TagBulkDeleteView(BulkDeleteView): queryset = Tag.objects.annotate( - items=Count('extras_taggeditem_items') - ).order_by(*Tag._meta.ordering) + items=get_subquery(TaggedItem, 'tag') + ) table = tables.TagTable