#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 добавил объяснение к вашим сомнениям. Примите ответ, если он понятен и проработан