diff --git a/apps/accounts/serializers/account/account.py b/apps/accounts/serializers/account/account.py index b50cb5134..c584e3b63 100644 --- a/apps/accounts/serializers/account/account.py +++ b/apps/accounts/serializers/account/account.py @@ -253,6 +253,8 @@ class AccountSerializer(AccountCreateUpdateSerializerMixin, BaseAccountSerialize 'source_id': {'required': False, 'allow_null': True}, } fields_unimport_template = ['params'] + # 手动判断唯一性校验 + validators = [] @classmethod def setup_eager_loading(cls, queryset): @@ -263,6 +265,21 @@ class AccountSerializer(AccountCreateUpdateSerializerMixin, BaseAccountSerialize ) return queryset + def validate(self, attrs): + instance = getattr(self, "instance", None) + if instance: + return super().validate(attrs) + + field_errors = {} + for _fields in Account._meta.unique_together: + lookup = {field: attrs.get(field) for field in _fields} + if Account.objects.filter(**lookup).exists(): + verbose_names = ', '.join([str(Account._meta.get_field(f).verbose_name) for f in _fields]) + msg_template = _('Account already exists. Field(s): {fields} must be unique.') + field_errors[_fields[0]] = msg_template.format(fields=verbose_names) + raise serializers.ValidationError(field_errors) + return attrs + class AccountDetailSerializer(AccountSerializer): has_secret = serializers.BooleanField(label=_("Has secret"), read_only=True)