From d05514962aba87984228c53fd6d2a822c0866d12 Mon Sep 17 00:00:00 2001 From: wangruidong <940853815@qq.com> Date: Tue, 17 Dec 2024 18:36:30 +0800 Subject: [PATCH] fix: calc platform asset count --- apps/assets/api/platform.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/assets/api/platform.py b/apps/assets/api/platform.py index ca6dc882f..e2d85ffbe 100644 --- a/apps/assets/api/platform.py +++ b/apps/assets/api/platform.py @@ -1,10 +1,10 @@ -from django.db.models import Count +from django.db.models import Subquery, OuterRef, Count, Value +from django.db.models.functions import Coalesce from django_filters import rest_framework as filters from rest_framework import generics from rest_framework import serializers from rest_framework.decorators import action from rest_framework.response import Response - from assets.const import AllTypes from assets.models import Platform, Node, Asset, PlatformProtocol from assets.serializers import PlatformSerializer, PlatformProtocolSerializer, PlatformListSerializer @@ -42,7 +42,10 @@ class AssetPlatformViewSet(JMSModelViewSet): def get_queryset(self): # 因为没有走分页逻辑,所以需要这里 prefetch - queryset = super().get_queryset().annotate(assets_amount=Count('assets')).prefetch_related( + asset_count_subquery = Asset.objects.filter(platform=OuterRef('pk')).values('platform').annotate( + count=Count('id')).values('count') + queryset = super().get_queryset().annotate( + assets_amount=Coalesce(Subquery(asset_count_subquery), Value(0))).prefetch_related( 'protocols', 'automation', 'labels', 'labels__label' ) queryset = queryset.filter(type__in=AllTypes.get_types_values())