Я только начинаю поиграться с Django REST Framework для стороннего проекта, и я пытаюсь заставить все имена пользователей быть строчными (так как по умолчанию они чувствительны к регистру, и я не хочу, чтобы у людей были такие имена пользователей, как kevin
и Kevin
например).
Это код, который я использую для создания пользователя:
# The serializer
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
token = serializers.SerializerMethodField()
def create(self, validated_data):
user = get_user_model().objects.create(**validated_data)
user.set_password(validated_data['password'])
user.save()
return user
def get_token(self, user):
token = Token.objects.create(user=user)
return token.key
class Meta:
model = get_user_model()
fields = ('username', 'first_name', 'last_name', 'email', 'password', 'token')
# The View
class RegisterUserView(CreateAPIView):
model = User
serializer_class = UserSerializer
permission_classes = (permissions.AllowAny, )
# And the URL pattern
urlpatterns = [
path(r'user/register/', RegisterUserView.as_view()),
]
Таким образом, пользователь может создать новую учетную запись, указав по крайней мере имя пользователя и пароль для user/register
, и в ответ он получит полный объект пользователя (с именем, фамилией, адресом электронной почты и токеном аутентификации). , Это работает.
Однако я борюсь с принудительным использованием строчных имен пользователей. Например, когда я добавляю что-то вроде validated_data['username'] = validated_data['username'].lower()
в функцию создания в сериализаторе, сервер просто генерирует ошибку 500 «Не удалось выполнить ограничение UNIQUE: auth_user.username» при попытке создать пользователя с тем же именем пользователя (но с другим регистром). Это, конечно, не идеально, эта ошибка 500.
Я нашел несколько предложений по добавлению собственного менеджера пользователей, что-то вроде этого:
lass MyUserManager(BaseUserManager):
def get_by_natural_key(self, username):
return self.get(username__iexact=username)
Но это тоже ничего не делало, после подключения через пользовательский класс пользователя и добавления в файл настроек. Я все еще могу создавать пользователей с заглавными буквами в имени пользователя.
Какое самое простое решение, чтобы заставить это просто работать?