Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions netbox/netbox/api/viewsets/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

from utilities.api import get_annotations_for_serializer, get_prefetches_for_serializer
from utilities.exceptions import AbortRequest
from utilities.query import reapply_model_ordering
from . import mixins

__all__ = (
Expand Down Expand Up @@ -122,13 +123,8 @@ def get_object_with_snapshot(self):
return obj

def get_queryset(self):
"""
Reapply model-level ordering in case it has been lost through .annotate().
https://code.djangoproject.com/ticket/32811
"""
qs = super().get_queryset()
ordering = qs.model._meta.ordering
return qs.order_by(*ordering)
return reapply_model_ordering(qs)

def get_serializer(self, *args, **kwargs):
# If a list of objects has been provided, initialize the serializer with many=True
Expand Down
8 changes: 2 additions & 6 deletions netbox/netbox/views/generic/bulk_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from utilities.forms.bulk_import import BulkImportForm
from utilities.htmx import htmx_partial
from utilities.permissions import get_permission_for_model
from utilities.query import reapply_model_ordering
from utilities.views import GetReturnURLMixin, get_viewname
from .base import BaseMultiObjectView
from .mixins import ActionsMixin, TableMixin
Expand Down Expand Up @@ -126,13 +127,8 @@ def export_template(self, template, request):
#

def get_queryset(self, request):
"""
Reapply model-level ordering in case it has been lost through .annotate().
https://code.djangoproject.com/ticket/32811
"""
qs = super().get_queryset(request)
ordering = qs.model._meta.ordering
return qs.order_by(*ordering)
return reapply_model_ordering(qs)

def get(self, request):
"""
Expand Down
17 changes: 16 additions & 1 deletion netbox/utilities/query.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from django.db.models import Count, OuterRef, Subquery
from django.db.models import Count, OuterRef, Subquery, QuerySet
from django.db.models.functions import Coalesce

from utilities.mptt import TreeManager

__all__ = (
'count_related',
'dict_to_filter_params',
'reapply_model_ordering',
)


Expand Down Expand Up @@ -54,3 +57,15 @@ def dict_to_filter_params(d, prefix=''):
else:
params[k] = val
return params


def reapply_model_ordering(queryset: QuerySet) -> QuerySet:
"""
Reapply model-level ordering in case it has been lost through .annotate().
https://code.djangoproject.com/ticket/32811
"""
# MPTT-based models are exempt from this; use caution when annotating querysets of these models
if any(isinstance(manager, TreeManager) for manager in queryset.model._meta.local_managers):
return queryset
ordering = queryset.model._meta.ordering
return queryset.order_by(*ordering)