From 63eb7e08a8455cf444943c8de253ca2e09174f5f Mon Sep 17 00:00:00 2001 From: Binx Date: Thu, 2 Jul 2026 00:16:16 +0800 Subject: [PATCH 1/3] fix: Remove uniqueness constraint from user nickname --- apps/local_model/models/user.py | 2 +- apps/users/models/user.py | 2 +- apps/users/serializers/user.py | 11 +---------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/apps/local_model/models/user.py b/apps/local_model/models/user.py index 0f480d89fde..d68130c242c 100644 --- a/apps/local_model/models/user.py +++ b/apps/local_model/models/user.py @@ -17,7 +17,7 @@ class User(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱", db_index=True) phone = models.CharField(max_length=20, verbose_name="电话", default="", db_index=True) - nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True, db_index=True) + nick_name = models.CharField(max_length=150, verbose_name="昵称", db_index=True) username = models.CharField(max_length=150, unique=True, verbose_name="用户名", db_index=True) password = models.CharField(max_length=150, verbose_name="密码") role = models.CharField(max_length=150, verbose_name="角色") diff --git a/apps/users/models/user.py b/apps/users/models/user.py index 0f480d89fde..d68130c242c 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -17,7 +17,7 @@ class User(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱", db_index=True) phone = models.CharField(max_length=20, verbose_name="电话", default="", db_index=True) - nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True, db_index=True) + nick_name = models.CharField(max_length=150, verbose_name="昵称", db_index=True) username = models.CharField(max_length=150, unique=True, verbose_name="用户名", db_index=True) password = models.CharField(max_length=150, verbose_name="密码") role = models.CharField(max_length=150, verbose_name="角色") diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index e49291e1bb9..eaff28e8c05 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -220,15 +220,12 @@ def is_valid(self, *, raise_exception=True): def _check_unique_username_and_email(self): username = self.data.get('username') email = self.data.get('email') - nick_name = self.data.get('nick_name') - user = User.objects.filter(Q(username=username) | Q(email=email) | Q(nick_name=nick_name)).first() + user = User.objects.filter(Q(username=username) | Q(email=email)).first() if user: if user.email == email: raise ExceptionCodeConstants.EMAIL_IS_EXIST.value.to_app_api_exception() if user.username == username: raise ExceptionCodeConstants.USERNAME_IS_EXIST.value.to_app_api_exception() - if user.nick_name == nick_name: - raise ExceptionCodeConstants.NICKNAME_IS_EXIST.value.to_app_api_exception() class Query(serializers.Serializer): username = serializers.CharField( @@ -411,12 +408,6 @@ class UserEditInstance(serializers.Serializer): def is_valid(self, *, user_id=None, raise_exception=False): super().is_valid(raise_exception=True) self._check_unique_email(user_id) - self._check_unique_nick_name(user_id) - - def _check_unique_nick_name(self, user_id): - nick_name = self.data.get('nick_name') - if nick_name and User.objects.filter(nick_name=nick_name).exclude(id=user_id).exists(): - raise AppApiException(1008, _('Nickname is already in use')) def _check_unique_email(self, user_id): email = self.data.get('email') From 8f19c5ef4d1da574f6cdc4247abfd8d9ad9f3a7e Mon Sep 17 00:00:00 2001 From: Binx Date: Thu, 2 Jul 2026 00:16:53 +0800 Subject: [PATCH 2/3] Revert "fix: Remove uniqueness constraint from user nickname" This reverts commit 63eb7e08a8455cf444943c8de253ca2e09174f5f. --- apps/local_model/models/user.py | 2 +- apps/users/models/user.py | 2 +- apps/users/serializers/user.py | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/local_model/models/user.py b/apps/local_model/models/user.py index d68130c242c..0f480d89fde 100644 --- a/apps/local_model/models/user.py +++ b/apps/local_model/models/user.py @@ -17,7 +17,7 @@ class User(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱", db_index=True) phone = models.CharField(max_length=20, verbose_name="电话", default="", db_index=True) - nick_name = models.CharField(max_length=150, verbose_name="昵称", db_index=True) + nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True, db_index=True) username = models.CharField(max_length=150, unique=True, verbose_name="用户名", db_index=True) password = models.CharField(max_length=150, verbose_name="密码") role = models.CharField(max_length=150, verbose_name="角色") diff --git a/apps/users/models/user.py b/apps/users/models/user.py index d68130c242c..0f480d89fde 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -17,7 +17,7 @@ class User(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱", db_index=True) phone = models.CharField(max_length=20, verbose_name="电话", default="", db_index=True) - nick_name = models.CharField(max_length=150, verbose_name="昵称", db_index=True) + nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True, db_index=True) username = models.CharField(max_length=150, unique=True, verbose_name="用户名", db_index=True) password = models.CharField(max_length=150, verbose_name="密码") role = models.CharField(max_length=150, verbose_name="角色") diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index eaff28e8c05..e49291e1bb9 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -220,12 +220,15 @@ def is_valid(self, *, raise_exception=True): def _check_unique_username_and_email(self): username = self.data.get('username') email = self.data.get('email') - user = User.objects.filter(Q(username=username) | Q(email=email)).first() + nick_name = self.data.get('nick_name') + user = User.objects.filter(Q(username=username) | Q(email=email) | Q(nick_name=nick_name)).first() if user: if user.email == email: raise ExceptionCodeConstants.EMAIL_IS_EXIST.value.to_app_api_exception() if user.username == username: raise ExceptionCodeConstants.USERNAME_IS_EXIST.value.to_app_api_exception() + if user.nick_name == nick_name: + raise ExceptionCodeConstants.NICKNAME_IS_EXIST.value.to_app_api_exception() class Query(serializers.Serializer): username = serializers.CharField( @@ -408,6 +411,12 @@ class UserEditInstance(serializers.Serializer): def is_valid(self, *, user_id=None, raise_exception=False): super().is_valid(raise_exception=True) self._check_unique_email(user_id) + self._check_unique_nick_name(user_id) + + def _check_unique_nick_name(self, user_id): + nick_name = self.data.get('nick_name') + if nick_name and User.objects.filter(nick_name=nick_name).exclude(id=user_id).exists(): + raise AppApiException(1008, _('Nickname is already in use')) def _check_unique_email(self, user_id): email = self.data.get('email') From cd2cb40c1d84a2ef5cc18410248d447091e9286e Mon Sep 17 00:00:00 2001 From: Binx Date: Thu, 2 Jul 2026 00:19:54 +0800 Subject: [PATCH 3/3] fix: Remove uniqueness constraint from user nickname --- apps/local_model/models/user.py | 2 +- apps/users/models/user.py | 2 +- apps/users/serializers/user.py | 11 +---------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/apps/local_model/models/user.py b/apps/local_model/models/user.py index 0f480d89fde..d68130c242c 100644 --- a/apps/local_model/models/user.py +++ b/apps/local_model/models/user.py @@ -17,7 +17,7 @@ class User(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱", db_index=True) phone = models.CharField(max_length=20, verbose_name="电话", default="", db_index=True) - nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True, db_index=True) + nick_name = models.CharField(max_length=150, verbose_name="昵称", db_index=True) username = models.CharField(max_length=150, unique=True, verbose_name="用户名", db_index=True) password = models.CharField(max_length=150, verbose_name="密码") role = models.CharField(max_length=150, verbose_name="角色") diff --git a/apps/users/models/user.py b/apps/users/models/user.py index 0f480d89fde..d68130c242c 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -17,7 +17,7 @@ class User(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱", db_index=True) phone = models.CharField(max_length=20, verbose_name="电话", default="", db_index=True) - nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True, db_index=True) + nick_name = models.CharField(max_length=150, verbose_name="昵称", db_index=True) username = models.CharField(max_length=150, unique=True, verbose_name="用户名", db_index=True) password = models.CharField(max_length=150, verbose_name="密码") role = models.CharField(max_length=150, verbose_name="角色") diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index e49291e1bb9..eaff28e8c05 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -220,15 +220,12 @@ def is_valid(self, *, raise_exception=True): def _check_unique_username_and_email(self): username = self.data.get('username') email = self.data.get('email') - nick_name = self.data.get('nick_name') - user = User.objects.filter(Q(username=username) | Q(email=email) | Q(nick_name=nick_name)).first() + user = User.objects.filter(Q(username=username) | Q(email=email)).first() if user: if user.email == email: raise ExceptionCodeConstants.EMAIL_IS_EXIST.value.to_app_api_exception() if user.username == username: raise ExceptionCodeConstants.USERNAME_IS_EXIST.value.to_app_api_exception() - if user.nick_name == nick_name: - raise ExceptionCodeConstants.NICKNAME_IS_EXIST.value.to_app_api_exception() class Query(serializers.Serializer): username = serializers.CharField( @@ -411,12 +408,6 @@ class UserEditInstance(serializers.Serializer): def is_valid(self, *, user_id=None, raise_exception=False): super().is_valid(raise_exception=True) self._check_unique_email(user_id) - self._check_unique_nick_name(user_id) - - def _check_unique_nick_name(self, user_id): - nick_name = self.data.get('nick_name') - if nick_name and User.objects.filter(nick_name=nick_name).exclude(id=user_id).exists(): - raise AppApiException(1008, _('Nickname is already in use')) def _check_unique_email(self, user_id): email = self.data.get('email')