带子弹字段的自定义用户模型

时间:2019-11-28 15:23:48

标签: django django-rest-framework

我有一个自定义用户模型,并且正在向模型添加一个子字段。问题是我不知道该如何在用户管理器中处理。

注意:我使用信号来创建弹头数据

model.py

class UserManager(BaseUserManager):

  def _create_user(self, email, fullname, password, is_staff, is_superuser, **extra_fields):
    if not email:
        raise ValueError('Users must have an email address')
    now = timezone.now()
    email = self.normalize_email(email)
    fullname = fullname
    user = self.model(
        email=email,
        fullname=fullname,
        is_staff=is_staff, 
        is_active=True,
        is_superuser=is_superuser, 
        last_login=now,
        date_joined=now, 
        **extra_fields
    )
    user.set_password(password)
    user.save(using=self._db)
    return user

  def create_user(self, email, fullname, password, **extra_fields):
    return self._create_user(email, fullname, password, False, False, **extra_fields)

  def create_superuser(self, email, fullname, password, **extra_fields):
    user=self._create_user(email, fullname, password, True, True, **extra_fields)
    user.save(using=self._db)
    return user


class User(AbstractBaseUser, PermissionsMixin):
    username = None
    email = models.EmailField(max_length=254, unique=True)
    fullname = models.CharField(max_length=250)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=255, unique=True)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['fullname']

    objects = UserManager()

    def __str__(self):
        return self.email

signals.py

@receiver(pre_save, sender=settings.AUTH_USER_MODEL)
def add_slug_to_user(sender, instance, *args, **kwargs):
    if instance and not instance.slug:
        slug = slugify(instance.fullname)
        random_string = generate_user_string()
        instance.slug = slug + "-" + random_string

问题是,如果我使用信号来创建它,该如何处理BaseUserManager中的子弹字段,尝试的方法会出错,例如

TypeError: create_superuser() missing 1 required positional argument: 'slug'

1 个答案:

答案 0 :(得分:1)

在用户模型中,如下修改slug模型:

slug = models.SlugField(max_length=255, unique=True, null=True, blank=True)

这将使slug字段为可选字段,并且不需要创建用户(例如last_login字段)。

我建议您不要使用信号来创建块,而应改写模型save()方法,因为通常将信号与其他模型相关联使用,并且在此非常不需要使用信号。因此,请将此方法添加到自定义用户模型中:

def save(self, *args, **kwargs):
    slug = slugify(self.fullname)
    random_string = generate_user_string()
    self.slug = slug + "-" + random_string
    super().save(*args, **kwargs)