diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index 76fc7e0b1..45476384c 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -12,6 +12,7 @@ from rest_framework.viewsets import GenericViewSet from utilities.api import get_annotations_for_serializer, get_prefetches_for_serializer from utilities.exceptions import AbortRequest +from utilities.mptt import TreeManager from . import mixins __all__ = ( @@ -127,6 +128,9 @@ class NetBoxModelViewSet( https://code.djangoproject.com/ticket/32811 """ qs = super().get_queryset() + # MPTT-based models are exempt from this; use caution when annotating querysets of these models + if any(isinstance(manager, TreeManager) for manager in qs.model._meta.local_managers): + return qs ordering = qs.model._meta.ordering return qs.order_by(*ordering) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 967c0eadb..fa9683c2c 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -27,6 +27,7 @@ from utilities.exceptions import AbortRequest, AbortTransaction, PermissionsViol from utilities.forms import BulkRenameForm, ConfirmationForm, restrict_form_fields from utilities.forms.bulk_import import BulkImportForm from utilities.htmx import htmx_partial +from utilities.mptt import TreeManager from utilities.permissions import get_permission_for_model from utilities.views import GetReturnURLMixin, get_viewname from .base import BaseMultiObjectView @@ -131,6 +132,9 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin): https://code.djangoproject.com/ticket/32811 """ qs = super().get_queryset(request) + # MPTT-based models are exempt from this; use caution when annotating querysets of these models + if any(isinstance(manager, TreeManager) for manager in qs.model._meta.local_managers): + return qs ordering = qs.model._meta.ordering return qs.order_by(*ordering)