Reputation: 21
I have written a custom User model, with no username. Still it appears in migrations as primary key and throws unique constraint error while adding new user.
Here is my User Model 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
Here is my User Model:
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
Now,The migrrations:
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')),
],
Wow,That was unexpected.Now since there is username here, which in unique constraint. I cannot add more than 1 user with blank username, as I provide email or phone only.
Upvotes: 2
Views: 925
Reputation: 15728
You did not written custom User without username as AbstractUser does implement a fully featured User model with admin-compliant permissions. As documented:
AbstractUser provides the full implementation of the default User as an abstract model.
You should extend AbstractBaseUser instead as documented
Upvotes: 1