mirror of
https://github.com/jumpserver/jumpserver.git
synced 2026-04-05 03:45:21 +00:00
perf: 批量创建账号时,跳过unique检查 不去创建 (#9966)
Co-authored-by: feng <1304903146@qq.com>
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user