Django Rest API : ValueError: неправильно сформированная шестнадцатеричная строка UUID
Я получаю следующую ошибку при попытке создать суперпользователя в Django 5.0.4 Rest API
Ошибка ValueError: неправильно сформированная шестнадцатеричная строка UUID
Вот трассировка стека :
Here is the stack trace :
File "/home/ubuntu/my_api/manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/ubuntu/myenv/lib/python3.10/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
utility.execute()
File "/home/ubuntu/myenv/lib/python3.10/site-packages/django/core/management/__init__.py", line 436, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/ubuntu/myenv/lib/python3.10/site-packages/django/core/management/base.py", line 413, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/ubuntu/myenv/lib/python3.10/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 89, in execute
return super().execute(*args, **options)
File "/home/ubuntu/myenv/lib/python3.10/site-packages/django/core/management/base.py", line 459, in execute
output = self.handle(*args, **options)
File "/home/ubuntu/myenv/lib/python3.10/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 131, in handle
error_msg = self._validate_username(
File "/home/ubuntu/myenv/lib/python3.10/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 304, in _validate_username
self.UserModel._default_manager.db_manager(database).get_by_natural_key(
File "/home/ubuntu/my_api/my_auth/models.py", line 55, in get_by_natural_key
uuid = UUID(uuid)
File "/usr/lib/python3.10/uuid.py", line 177, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
Определения моделей:
from uuid import UUID
class UserManager(DjangoUserManager):
def get_by_natural_key(self, uuid):
if not isinstance(uuid, UUID):
uuid = UUID(uuid)
return self.get(uuid=uuid)
class User(AbstractUser):
""""
Custom user model to change behaviour of the default user model
such as validation and required fields.
"""
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True,verbose_name=_("UUID"))
Что я пробовал
- удалить миграции
- очистить базу данных с помощью команды flush
- сбросить базу данных с помощью команды reset_db
В методе get_by_natural_key
, значение поля из USERNAME_FIELD
пройден, поэтому в вашем случае вы получаете username
вместо uuid
, что приводит к ошибке.
Если вы создадите суперпользователя через консоль, здесь будет вызван get_by_natural_key
со значением username
в качестве аргумента .
Я думаю, что в вашем случае вам, вероятно, вообще не следует переопределять get_by_natural_key
. Ваше поле uuid
имеет значение по умолчанию и всегда будет создаваться автоматически при создании экземпляра. Однако вот немного упрощенный пример, где это действительно имеет смысл:
class CustomUserManger(BaseUserManager):
def get_by_natural_key(self, email):
email_field = self.model.get_email_field_name()
return self.get(**{f'{email_field}__iexact': email})
class User(AbstractBaseUser, PermissionsMixin):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False,
)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
objects = CustomUserManger()
EMAIL_FIELD = USERNAME_FIELD = 'email'
Предположим, вы решили вообще не использовать поле username
и решили сохранить email
в качестве уникального идентификатора. Тогда мы можем переопределить USERNAME_FIELD = “email”
. И переопределите метод get_by_natural_key
, чтобы искать email
в базе данных без учета регистра.