#django #django-models #django-users #django-custom-user #django-custom-manager
#джанго #django-модели #django-пользователи #django-пользовательский пользователь #django-custom-manager
Вопрос:
Я написал пользовательскую модель пользователя без имени пользователя. Тем не менее, оно появляется в миграциях как первичный ключ и выдает уникальную ошибку ограничения при добавлении нового пользователя.
Вот мой менеджер пользовательских моделей:
class UserManager(BaseUserManager):
def create_user(self, password,email=None, phone=None, **extra_fields):
if not email and not phone:
raise ValueError("User must have an email address or phone number")
if email:
email = self.normalize_email(email)
user = self.model(email=email,**extra_fields)
elif phone:
user = self.model(phone=phone,**extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password):
user = self.model(
email=self.normalize_email(email),
is_staff=True,
is_admin=True,
is_superuser=True,
)
user.set_password(password)
user.save()
return user
Вот моя модель пользователя:
class User(AbstractUser):
email = models.EmailField(unique=True,
verbose_name='email address',
max_length=255,
null=True
)
phone = models.CharField(unique=True,
verbose_name='phone number',
max_length=10,
null=True
)
name = models.CharField(max_length=300,null=True)
profile_pic = models.ImageField(null=True, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def __str__(self):
return str(self.email)
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
return True
def has_module_perm(self, app_label):
"Does the user have permissions to view the app `app_label`?"
return True
Теперь миграции:
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./ /-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('email', models.EmailField(max_length=255, null=True, unique=True, verbose_name='email address')),
('phone', models.CharField(max_length=10, null=True, unique=True, verbose_name='phone number')),
('name', models.CharField(max_length=300, null=True)),
('profile_pic', models.ImageField(blank=True, null=True, upload_to='')),
('is_active', models.BooleanField(default=True)),
('is_staff', models.BooleanField(default=False)),
('is_admin', models.BooleanField(default=False)),
('is_superuser', models.BooleanField(default=False)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
],
Вау, это было неожиданно.Теперь, поскольку здесь есть имя пользователя, которое в уникальном ограничении. Я не могу добавить более 1 пользователя с пустым именем пользователя, так как я предоставляю только электронную почту или телефон.
Ответ №1:
Вы не написали пользовательского пользователя без имени пользователя, поскольку AbstractUser реализует полнофункциональную пользовательскую модель с разрешениями, совместимыми с правами администратора. Как задокументировано:
AbstractUser обеспечивает полную реализацию пользователя по умолчанию в качестве абстрактной модели.
Вместо этого вы должны расширить AbstractBaseUser, как указано в документации