#19740: Annotate cumulative counts for platform child objects

This commit is contained in:
Jeremy Stretch 2025-08-12 13:58:48 -04:00
parent 77def92c25
commit e4f0611f78
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 dcim.models import Platform
from extras.api.serializers_.configtemplates import ConfigTemplateSerializer from extras.api.serializers_.configtemplates import ConfigTemplateSerializer
from netbox.api.fields import RelatedObjectCountField
from netbox.api.serializers import NestedGroupModelSerializer from netbox.api.serializers import NestedGroupModelSerializer
from .manufacturers import ManufacturerSerializer from .manufacturers import ManufacturerSerializer
from .nested import NestedPlatformSerializer from .nested import NestedPlatformSerializer
@ -16,8 +17,8 @@ class PlatformSerializer(NestedGroupModelSerializer):
config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None)
# Related object counts # Related object counts
device_count = RelatedObjectCountField('devices') device_count = serializers.IntegerField(read_only=True, default=0)
virtualmachine_count = RelatedObjectCountField('virtual_machines') virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
class Meta: class Meta:
model = Platform model = Platform

View File

@ -20,6 +20,7 @@ from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin
from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from utilities.query_functions import CollateAsChar from utilities.query_functions import CollateAsChar
from virtualization.models import VirtualMachine
from . import serializers from . import serializers
from .exceptions import MissingFilterException from .exceptions import MissingFilterException
@ -360,8 +361,20 @@ class DeviceRoleViewSet(NetBoxModelViewSet):
# Platforms # Platforms
# #
class PlatformViewSet(NetBoxModelViewSet): class PlatformViewSet(MPTTLockedMixin, NetBoxModelViewSet):
queryset = Platform.objects.all() 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 serializer_class = serializers.PlatformSerializer
filterset_class = filtersets.PlatformFilterSet filterset_class = filtersets.PlatformFilterSet

View File

@ -2109,9 +2109,18 @@ class DeviceRoleBulkDeleteView(generic.BulkDeleteView):
@register_model_view(Platform, 'list', path='', detail=False) @register_model_view(Platform, 'list', path='', detail=False)
class PlatformListView(generic.ObjectListView): class PlatformListView(generic.ObjectListView):
queryset = Platform.objects.annotate( queryset = Platform.objects.add_related_count(
device_count=count_related(Device, 'platform'), Platform.objects.add_related_count(
vm_count=count_related(VirtualMachine, 'platform') Platform.objects.all(),
VirtualMachine,
'platform',
'vm_count',
cumulative=True
),
Device,
'platform',
'device_count',
cumulative=True
) )
table = tables.PlatformTable table = tables.PlatformTable
filterset = filtersets.PlatformFilterSet filterset = filtersets.PlatformFilterSet