From 34ca646fba3c687ab616b975464ccadd38da8fc7 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 19 Jul 2023 11:12:50 +0700 Subject: [PATCH] 6347 optimize migrations --- ...175_device__console_port_count_and_more.py | 47 ++++++++++++++----- .../0035_virtualmachine__interface_count.py | 10 ++-- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/netbox/dcim/migrations/0175_device__console_port_count_and_more.py b/netbox/dcim/migrations/0175_device__console_port_count_and_more.py index d798ffb5f..edc0e9015 100644 --- a/netbox/dcim/migrations/0175_device__console_port_count_and_more.py +++ b/netbox/dcim/migrations/0175_device__console_port_count_and_more.py @@ -2,21 +2,46 @@ from django.db import migrations import utilities.fields +from django.db.models import Count def recalculate_device_counts(apps, schema_editor): Device = apps.get_model("dcim", "Device") - for device in Device.objects.all(): - device._console_port_count = device.consoleports.count() - device._console_server_port_count = device.consoleserverports.count() - device._interface_count = device.interfaces.count() - device._front_port_count = device.frontports.count() - device._rear_port_count = device.rearports.count() - device._device_bay_count = device.devicebays.count() - device._inventory_item_count = device.inventoryitems.count() - device._power_port_count = device.powerports.count() - device._power_outlet_count = device.poweroutlets.count() - device.save() + devices = list(Device.objects.all().annotate( + console_port_count=Count('consoleports'), + console_server_port_count=Count('consoleserverports'), + interface_count=Count('interfaces'), + front_port_count=Count('frontports'), + rear_port_count=Count('rearports'), + device_bay_count=Count('devicebays'), + inventory_item_count=Count('inventoryitems'), + power_port_count=Count('powerports'), + power_outlet_count=Count('poweroutlets'), + )) + + for device in devices: + device._console_port_count = console_port_count + device._console_server_port_count = console_server_port_count + device._interface_count = interface_count + device._front_port_count = front_port_count + device._rear_port_count = rear_port_count + device._device_bay_count = device_bay_count + device._inventory_item_count = inventory_item_count + device._power_port_count = power_port_count + device._power_outlet_count = power_outlet_count + + Device.objects.bulk_update( + devices, + ['_console_port_count', + '_console_server_port_count', + '_interface_count', + '_front_port_count', + '_rear_port_count', + '_device_bay_count', + '_inventory_item_count', + '_power_port_count', + '_power_outlet_count'], + ) class Migration(migrations.Migration): diff --git a/netbox/virtualization/migrations/0035_virtualmachine__interface_count.py b/netbox/virtualization/migrations/0035_virtualmachine__interface_count.py index c74b6c077..2657146c9 100644 --- a/netbox/virtualization/migrations/0035_virtualmachine__interface_count.py +++ b/netbox/virtualization/migrations/0035_virtualmachine__interface_count.py @@ -2,14 +2,18 @@ from django.db import migrations import utilities.fields +from django.db.models import Count def populate_virtualmachine_counts(apps, schema_editor): VirtualMachine = apps.get_model('virtualization', 'VirtualMachine') - for vm in VirtualMachine.objects.all(): - vm._interface_count = vm.interfaces.count() - vm.save() + vms = list(VirtualMachine.objects.annotate(interface_count=Count('interfaces'))) + + for vm in vms: + vm._interface_count = vm.interface_count + + VirtualMachine.objects.bulk_update(vms, ['_interface_count']) class Migration(migrations.Migration):