From a6aca287e861a32e4a83299532ca732fa0534962 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Aug 2025 13:58:48 -0400 Subject: [PATCH] #19740: Annotate cumulative counts for platform child objects --- netbox/dcim/api/serializers_/platforms.py | 7 ++++--- netbox/dcim/api/views.py | 17 +++++++++++++++-- netbox/dcim/views.py | 15 ++++++++++++--- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/netbox/dcim/api/serializers_/platforms.py b/netbox/dcim/api/serializers_/platforms.py index c357b0bbe..08f8a64a8 100644 --- a/netbox/dcim/api/serializers_/platforms.py +++ b/netbox/dcim/api/serializers_/platforms.py @@ -1,6 +1,7 @@ +from rest_framework import serializers + from dcim.models import Platform from extras.api.serializers_.configtemplates import ConfigTemplateSerializer -from netbox.api.fields import RelatedObjectCountField from netbox.api.serializers import NestedGroupModelSerializer from .manufacturers import ManufacturerSerializer from .nested import NestedPlatformSerializer @@ -16,8 +17,8 @@ class PlatformSerializer(NestedGroupModelSerializer): config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts - device_count = RelatedObjectCountField('devices') - virtualmachine_count = RelatedObjectCountField('virtual_machines') + device_count = serializers.IntegerField(read_only=True, default=0) + virtualmachine_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = Platform diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index a64c9e5e3..a64a157e0 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -20,6 +20,7 @@ from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from utilities.api import get_serializer_for_model from utilities.query_functions import CollateAsChar +from virtualization.models import VirtualMachine from . import serializers from .exceptions import MissingFilterException @@ -360,8 +361,20 @@ class DeviceRoleViewSet(NetBoxModelViewSet): # Platforms # -class PlatformViewSet(NetBoxModelViewSet): - queryset = Platform.objects.all() +class PlatformViewSet(MPTTLockedMixin, NetBoxModelViewSet): + queryset = Platform.objects.add_related_count( + Platform.objects.add_related_count( + Platform.objects.all(), + VirtualMachine, + 'platform', + 'virtualmachine_count', + cumulative=True + ), + Device, + 'platform', + 'device_count', + cumulative=True + ) serializer_class = serializers.PlatformSerializer filterset_class = filtersets.PlatformFilterSet diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 277a634ce..4956cc5e3 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2109,9 +2109,18 @@ class DeviceRoleBulkDeleteView(generic.BulkDeleteView): @register_model_view(Platform, 'list', path='', detail=False) class PlatformListView(generic.ObjectListView): - queryset = Platform.objects.annotate( - device_count=count_related(Device, 'platform'), - vm_count=count_related(VirtualMachine, 'platform') + queryset = Platform.objects.add_related_count( + Platform.objects.add_related_count( + Platform.objects.all(), + VirtualMachine, + 'platform', + 'vm_count', + cumulative=True + ), + Device, + 'platform', + 'device_count', + cumulative=True ) table = tables.PlatformTable filterset = filtersets.PlatformFilterSet