NOT NULL约束失败:users_user.email

时间:2019-09-12 13:23:53

标签: python django django-rest-framework

我刚刚创建了一个自定义用户模型和一个自定义用户管理器。我可以使用manage.py createsuperuser创建超级用户,但是在管理面板上进行更新,删除甚至创建新用户时,我都遇到了这个奇怪的错误:

  

没有NULL约束失败:users_user.email

我不知道如何解决它,只是卡住了。这是我的模特和我的经理:

class UserManager(BaseUserManager):
    #custom create_user method
    def create_user(self, email, password=None):
        if not email:
            raise ValueError('Users must have an email address')
        user = self.model(
            email = self.normalize_email(email)
        )
        print(email)
        user.set_password(password)
        user.save(using=self._db)
        print(user)
        return user

    #Custom create_super_user method
    def create_superuser(self, email, password=None):
        user = self.create_user(
            email = email,
            password = password
        )
        user.admin = True
        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    #setting up Choices for interest, Must add other fields ...
    #interests = MultiSelectField(
    #    max_length = 2,
    #    choices = INTERESTS_CHOICES
    #)


    #Setting up a Ranking System

    email = models.EmailField(
        max_length=50,
        unique=True,
        blank=False,
        null=False
    )
    username = models.CharField(
        max_length=25,
        unique=True,
        null=True,
        blank=True
    )
    date_joined = models.DateTimeField(auto_now_add=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=70)
    birth_date = models.DateField(null=True, blank=True)
    reputation = models.PositiveIntegerField(default=0)
    active = models.BooleanField(default=True)
    rank = models.CharField(choices=RANKING_CHOICES, max_length=5, default="basic")
    is_staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    bio = models.TextField(
        max_length=300,
        default="default Bio",
        blank=True
    )
    objects = UserManager()
    #Setting email to be the main source of authentication
    USERNAME_FIELD = 'email'

    #Super User Only
    REQUIRED_FIELDS = ['password']

    #def get_absolute_url(self):
        #use reverse + nom de l'url de view

    def __str__(self):
        return str(self.email)

    def get_full_name(self):
        return f"{self.first_name} {self.last_name}"

    def get_short_name(self):
        return self.first_name

    def get_username(self):
        return self.username

    def set_user_league(self):
        if 15 <= self.reputation < 40:
            self.rank = "gold"
        elif 40 <= self.reputation < 80:
            self.rank = "platinium"
        else:
            self.rank = "diamond"

    @property
    def is_admin(self):
        print(f" is {self.email} admin ? ")
        return self.admin

    def has_perm(self, obj=None):
        return True

    def has_module_perms(self, obj=None):
        return True

我该怎么办?我被困了几个小时。谢谢 !

1 个答案:

答案 0 :(得分:0)

使您的模型与用户模型成为OneToOne关系。然后使用null=True

重写电子邮件字段