From 69cd7bce17258358d18efa76ed903227bb14c683 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 20 Mar 2023 15:45:21 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=89=B9=E9=87=8F=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=97=B6=EF=BC=8C=E8=B7=B3=E8=BF=87unique?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=20=E4=B8=8D=E5=8E=BB=E5=88=9B=E5=BB=BA=20(#9?= =?UTF-8?q?966)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: feng <1304903146@qq.com> --- apps/accounts/serializers/account/account.py | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/apps/accounts/serializers/account/account.py b/apps/accounts/serializers/account/account.py index 295c8ed1f..739ef7e37 100644 --- a/apps/accounts/serializers/account/account.py +++ b/apps/accounts/serializers/account/account.py @@ -1,5 +1,8 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers +from rest_framework.validators import ( + UniqueTogetherValidator, ValidationError +) from accounts.const import SecretType, Source from accounts.models import Account, AccountTemplate @@ -8,8 +11,20 @@ from assets.const import Category, AllTypes from assets.models import Asset from common.serializers import SecretReadableMixin, BulkModelSerializer from common.serializers.fields import ObjectRelatedField, LabeledChoiceField +from common.utils import get_logger from .base import BaseAccountSerializer +logger = get_logger(__name__) + + +class SkipUniqueValidator(UniqueTogetherValidator): + def __call__(self, attrs, serializer): + try: + super().__call__(attrs, serializer) + except ValidationError as e: + logger.debug(f'{attrs.get("asset")}: {e.detail[0]}') + raise ValidationError({}) + class AccountSerializerCreateValidateMixin: from_id: str @@ -122,6 +137,18 @@ class AccountSerializer(AccountSerializerCreateMixin, BaseAccountSerializer): .prefetch_related('asset', 'asset__platform', 'asset__platform__automation') return queryset + def get_validators(self): + validators = [] + data = self.context['request'].data + action = self.context['view'].action + _validators = super().get_validators() + ignore = action == 'create' and isinstance(data, list) and len(data) > 1 + for v in _validators: + if ignore and isinstance(v, UniqueTogetherValidator): + v = SkipUniqueValidator(v.queryset, v.fields) + validators.append(v) + return validators + class AccountSecretSerializer(SecretReadableMixin, AccountSerializer): class Meta(AccountSerializer.Meta):