#19740: Annotate cumulative counts for platform child objects

This commit is contained in:
Jeremy Stretch 2025-08-12 13:58:48 -04:00
parent dda4ad9bb0
commit a6aca287e8
3 changed files with 31 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -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