Просмотр исходного кода

#19740: Annotate cumulative counts for platform child objects

Jeremy Stretch 6 месяцев назад
Родитель
Сommit
a6aca287e8
3 измененных файлов с 31 добавлено и 8 удалено
  1. 4 3
      netbox/dcim/api/serializers_/platforms.py
  2. 15 2
      netbox/dcim/api/views.py
  3. 12 3
      netbox/dcim/views.py

+ 4 - 3
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

+ 15 - 2
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
 

+ 12 - 3
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