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"))

Что я пробовал

  1. удалить миграции
  2. очистить базу данных с помощью команды flush
  3. сбросить базу данных с помощью команды 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 в базе данных без учета регистра.

Вернуться на верх