From 387a9248fc246bf2fdcb67095f172cefccb0076d Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 10 Nov 2025 18:04:00 +0800 Subject: [PATCH] perf: Add a key to cover all protocols and ports (#16227) Co-authored-by: wangruidong <940853815@qq.com> --- apps/assets/api/asset/asset.py | 40 ++++++++++------------------------ apps/i18n/lina/en.json | 1 + apps/i18n/lina/zh.json | 1 + 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/apps/assets/api/asset/asset.py b/apps/assets/api/asset/asset.py index 2763f04c0..3b32fee1f 100644 --- a/apps/assets/api/asset/asset.py +++ b/apps/assets/api/asset/asset.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- # -from collections import defaultdict - from django.conf import settings +from django.db import transaction from django.shortcuts import get_object_or_404 from django.utils.translation import gettext as _ from django_filters import rest_framework as drf_filters @@ -181,33 +180,18 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet): def sync_platform_protocols(self, request, *args, **kwargs): platform_id = request.data.get('platform_id') platform = get_object_or_404(Platform, pk=platform_id) - assets = platform.assets.all() + asset_ids = list(platform.assets.values_list('id', flat=True)) + platform_protocols = list(platform.protocols.values('name', 'port')) - platform_protocols = { - p['name']: p['port'] - for p in platform.protocols.values('name', 'port') - } - asset_protocols_map = defaultdict(set) - protocols = assets.prefetch_related('protocols').values_list( - 'id', 'protocols__name' - ) - for asset_id, protocol in protocols: - asset_id = str(asset_id) - asset_protocols_map[asset_id].add(protocol) - objs = [] - for asset_id, protocols in asset_protocols_map.items(): - protocol_names = set(platform_protocols) - protocols - if not protocol_names: - continue - for name in protocol_names: - objs.append( - Protocol( - name=name, - port=platform_protocols[name], - asset_id=asset_id, - ) - ) - Protocol.objects.bulk_create(objs) + with transaction.atomic(): + if asset_ids: + Protocol.objects.filter(asset_id__in=asset_ids).delete() + if asset_ids and platform_protocols: + objs = [] + for aid in asset_ids: + for p in platform_protocols: + objs.append(Protocol(name=p['name'], port=p['port'], asset_id=aid)) + Protocol.objects.bulk_create(objs) return Response(status=status.HTTP_200_OK) def filter_bulk_update_data(self): diff --git a/apps/i18n/lina/en.json b/apps/i18n/lina/en.json index 25ef99442..9ecca6196 100644 --- a/apps/i18n/lina/en.json +++ b/apps/i18n/lina/en.json @@ -1628,6 +1628,7 @@ "setVariable": "Set variable", "userId": "User ID", "userName": "User name", + "overwriteProtocolsAndPortsMsg": "This operation will overwrite the protocols and ports of the selected assets. Are you sure you want to continue?" "selectFiles": "Selected {number} files", "selectedAssets": "Selected assets", "pleaseSelectAssets": "Please select assets", diff --git a/apps/i18n/lina/zh.json b/apps/i18n/lina/zh.json index 758d6cb56..37ba981f3 100644 --- a/apps/i18n/lina/zh.json +++ b/apps/i18n/lina/zh.json @@ -1638,6 +1638,7 @@ "setVariable": "设置参数", "userId": "用户ID", "userName": "用户名", + "overwriteProtocolsAndPortsMsg": "此操作将覆盖所有协议和端口,是否继续?" "selectedAssets": "已选资产", "clickToAdd": "点击添加", "pleaseSelectAssets": "请选择资产"