【问题标题】:Username appearing in django migrations over custom User model with no username用户名出现在没有用户名的自定义用户模型上的 django 迁移中
【发布时间】:2021-05-06 22:43:45
【问题描述】:

我编写了一个自定义用户模型,没有用户名。它仍然作为主键出现在迁移中,并在添加新用户时引发唯一约束错误。

这是我的用户模型管理器:

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 个用户名空白的用户,因为我只提供电子邮件或电话。

【问题讨论】:

    标签: django django-models django-users django-custom-user django-custom-manager


    【解决方案1】:

    您没有编写没有用户名的自定义用户,因为 AbstractUser 确实实现了具有管理员兼容权限的全功能用户模型。作为documented

    AbstractUser 提供了默认用户的完整实现 一个抽象模型。

    您应该将 AbstractBaseUser 扩展为 documented

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 2018-05-13
      • 1970-01-01
      • 2013-06-08
      • 2012-10-01
      • 2017-02-02
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多