Skip to content

Commit 704f050

Browse files
authored
Merge pull request #20141 from netbox-community/19970-devicerole-child-counts
Fixes #19970: Report device & VM counts for child device roles on parents
2 parents 122e2d1 + 92fba0b commit 704f050

File tree

3 files changed

+30
-8
lines changed

3 files changed

+30
-8
lines changed

netbox/dcim/api/serializers_/roles.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from rest_framework import serializers
2+
13
from dcim.models import DeviceRole, InventoryItemRole
24
from extras.api.serializers_.configtemplates import ConfigTemplateSerializer
35
from netbox.api.fields import RelatedObjectCountField
@@ -13,10 +15,8 @@
1315
class DeviceRoleSerializer(NestedGroupModelSerializer):
1416
parent = NestedDeviceRoleSerializer(required=False, allow_null=True, default=None)
1517
config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None)
16-
17-
# Related object counts
18-
device_count = RelatedObjectCountField('devices')
19-
virtualmachine_count = RelatedObjectCountField('virtual_machines')
18+
device_count = serializers.IntegerField(read_only=True, default=0)
19+
virtualmachine_count = serializers.IntegerField(read_only=True, default=0)
2020

2121
class Meta:
2222
model = DeviceRole

netbox/dcim/api/views.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin
2121
from utilities.api import get_serializer_for_model
2222
from utilities.query_functions import CollateAsChar
23+
from virtualization.models import VirtualMachine
2324
from . import serializers
2425
from .exceptions import MissingFilterException
2526

@@ -351,7 +352,19 @@ class InventoryItemTemplateViewSet(MPTTLockedMixin, NetBoxModelViewSet):
351352
#
352353

353354
class DeviceRoleViewSet(NetBoxModelViewSet):
354-
queryset = DeviceRole.objects.all()
355+
queryset = DeviceRole.objects.add_related_count(
356+
DeviceRole.objects.add_related_count(
357+
DeviceRole.objects.all(),
358+
VirtualMachine,
359+
'role',
360+
'virtualmachine_count',
361+
cumulative=True
362+
),
363+
Device,
364+
'role',
365+
'device_count',
366+
cumulative=True
367+
)
355368
serializer_class = serializers.DeviceRoleSerializer
356369
filterset_class = filtersets.DeviceRoleFilterSet
357370

netbox/dcim/views.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1990,9 +1990,18 @@ class InventoryItemTemplateBulkDeleteView(generic.BulkDeleteView):
19901990

19911991
@register_model_view(DeviceRole, 'list', path='', detail=False)
19921992
class DeviceRoleListView(generic.ObjectListView):
1993-
queryset = DeviceRole.objects.annotate(
1994-
device_count=count_related(Device, 'role'),
1995-
vm_count=count_related(VirtualMachine, 'role')
1993+
queryset = DeviceRole.objects.add_related_count(
1994+
DeviceRole.objects.add_related_count(
1995+
DeviceRole.objects.all(),
1996+
VirtualMachine,
1997+
'role',
1998+
'vm_count',
1999+
cumulative=True
2000+
),
2001+
Device,
2002+
'role',
2003+
'device_count',
2004+
cumulative=True
19962005
)
19972006
filterset = filtersets.DeviceRoleFilterSet
19982007
filterset_form = forms.DeviceRoleFilterForm

0 commit comments

Comments
 (0)