Ошибка значения: поле ‘id’ ожидало число, но получило ‘demo@gmail.com ‘

#python #django #django-models #model

Вопрос:

Я пытаюсь создать пользовательскую модель, чтобы пользователи могли регистрироваться через адрес электронной почты вместо имени пользователя. Я получаю ValueError: Field 'id' expected a number but got 'demo@gmail.com'. , когда пытаюсь создать суперпользователя, у них не было проблем в makemigrations и migrate

также попробуйте удалить pycache и все старые миграции и файл db, но все равно тот же. вывод colsole также находится в конце, вот модели

Пользовательская модель

 class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_("email address"), unique=True)
    first_name = models.CharField(_("first name"), max_length=10, blank=True)
    last_name = models.CharField(_("last name"), max_length=10, blank=True)
    date_joined = models.DateTimeField(_("date joined"), auto_now_add=True)
    is_active = models.BooleanField(_("is active"), default=True)

    # User Manager here
    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
    
    def get_full_name(self):
        full_name = self.first_name   " "   self.last_name
        return full_name.strip()
 

Менеджер пользователей

 class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self,email,password, **extra_fields):
        """
        Create and save user
        """
        if not email:
            raise ValueError("Email is not available")
        email = self.normalize_email(email)
        user = self.model(email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_user(self,email, password=None, **extra_fields):
        """
        Create a user
        """
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)
    
    def create_superuser(self,email, password, **extra_fields):
        """
        Create super user 
        """
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True")

        return self._create_user(email, password, **extra_fields)
 

colsone

 (venv) D:PythonDjangodjango-bookshopbookshop>py manage.py createsuperuser
Email address: demo@gmail.com
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Traceback (most recent call last):
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsfields__init__.py", line 1823, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'demo@gmail.com'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:PythonDjangodjango-bookshopbookshopmanage.py", line 22, in <module>
    main()
  File "D:PythonDjangodjango-bookshopbookshopmanage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangocoremanagement__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangocoremanagement__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangocoremanagementbase.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangocontribauthmanagementcommandscreatesuperuser.py", line 79, in execute
    return super().execute(*args, **options)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangocoremanagementbase.py", line 398, in execute
    output = self.handle(*args, **options)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangocontribauthmanagementcommandscreatesuperuser.py", line 189, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
  File "D:PythonDjangodjango-bookshopbookshopaccountmanagers.py", line 35, in create_superuser
    return self._create_user(email, password, **extra_fields)
  File "D:PythonDjangodjango-bookshopbookshopaccountmanagers.py", line 16, in _create_user
    user.save(using=self._db)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangocontribauthbase_user.py", line 67, in save
    super().save(*args, **kwargs)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsbase.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsbase.py", line 763, in save_base
    updated = self._save_table(
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsbase.py", line 845, in _save_table
    updated = self._do_update(base_qs, using, pk_val, values, update_fields,
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsbase.py", line 879, in _do_update
    filtered = base_qs.filter(pk=pk_val)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsquery.py", line 941, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsquery.py", line 961, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsquery.py", line 968, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1393, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1412, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1347, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelssqlquery.py", line 1193, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelslookups.py", line 25, in __init__
    self.rhs = self.get_prep_lookup()
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelslookups.py", line 77, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
  File "D:PythonDjangodjango-bookshopvenvlibsite-packagesdjangodbmodelsfields__init__.py", line 1825, in get_prep_value
    raise e.__class__(
ValueError: Field 'id' expected a number but got 'demo@gmail.com'.
 

Ответ №1:

В вашей _create_user функции UserManager

 user = self.model(email, **extra_fields)
 

должно быть

 user = self.model(email=email, **extra_fields)
 

Когда вы инициализируете модель, как показано в первом коде, аргументы передаются полям в том порядке, в котором они определены в модели. Первое поле будет всегда id . По умолчанию Django предоставляет каждой модели автоматически увеличивающийся первичный ключ.(https://docs.djangoproject.com/en/3.2/topics/db/models/#automatic-primary-key-fields ), поэтому здесь значение электронной почты присваивается id .

По этой причине вам необходимо указать, какому полю должно быть присвоено значение email. следовательно, как показано во втором коде, вам нужно дать email=email

Комментарии:

1. это сработало. Спасибо, но почему я должен указывать только это email=email

2. @umairmehmood добавил объяснение к вашим сомнениям. Примите ответ, если он понятен и проработан