diff --git a/netbox/dcim/api/serializers_/roles.py b/netbox/dcim/api/serializers_/roles.py index 17eeaa949..0f83655a6 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/netbox/dcim/api/serializers_/roles.py @@ -1,3 +1,5 @@ +from rest_framework import serializers + from dcim.models import DeviceRole, InventoryItemRole from extras.api.serializers_.configtemplates import ConfigTemplateSerializer from netbox.api.fields import RelatedObjectCountField @@ -13,10 +15,8 @@ __all__ = ( class DeviceRoleSerializer(NestedGroupModelSerializer): parent = NestedDeviceRoleSerializer(required=False, allow_null=True, default=None) 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 = DeviceRole diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index a64c9e5e3..eafe813a7 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 @@ -351,7 +352,19 @@ class InventoryItemTemplateViewSet(MPTTLockedMixin, NetBoxModelViewSet): # class DeviceRoleViewSet(NetBoxModelViewSet): - queryset = DeviceRole.objects.all() + queryset = DeviceRole.objects.add_related_count( + DeviceRole.objects.add_related_count( + DeviceRole.objects.all(), + VirtualMachine, + 'role', + 'virtualmachine_count', + cumulative=True + ), + Device, + 'role', + 'device_count', + cumulative=True + ) serializer_class = serializers.DeviceRoleSerializer filterset_class = filtersets.DeviceRoleFilterSet diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 304438698..c53426f1a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1990,9 +1990,18 @@ class InventoryItemTemplateBulkDeleteView(generic.BulkDeleteView): @register_model_view(DeviceRole, 'list', path='', detail=False) class DeviceRoleListView(generic.ObjectListView): - queryset = DeviceRole.objects.annotate( - device_count=count_related(Device, 'role'), - vm_count=count_related(VirtualMachine, 'role') + queryset = DeviceRole.objects.add_related_count( + DeviceRole.objects.add_related_count( + DeviceRole.objects.all(), + VirtualMachine, + 'role', + 'vm_count', + cumulative=True + ), + Device, + 'role', + 'device_count', + cumulative=True ) filterset = filtersets.DeviceRoleFilterSet filterset_form = forms.DeviceRoleFilterForm