Django如何进行createsuperuser检查重复的电子邮件地址

时间:2019-04-16 03:37:13

标签: django django-models

def create_superuser(self, username, email, password=None):
    user = self.create_user(
        username, email, password=password
    )
    user.is_admin = True
    user.is_staff = True
    user.active = True
    user.save(using=self._db)
    return user

我已经创建了一个自定义用户模型。当我调用createsuperuser时,如果输入的用户名已经在数据库中,它将提示

'Error: That username is already taken.'

但是,如果我输入数据库中已经存在的电子邮件地址,则不会提示该电子邮件已被错误处理。相反,它让我通过并输入密码后出现了以下错误:

django.db.utils.IntegrityError: UNIQUE constraint failed: users_customuser.email

有没有办法像检查用户名一样使其也检查电子邮件地址?

1 个答案:

答案 0 :(得分:0)

def create_superuser(self, username, email, password=None):
    duplicate = self.filter(email=email)  # I'm assuming `self` is User.objects
    if len(duplicate) != 0:
        return "Duplicate email"  # Customize your error handling logic here
    user = self.create_user(
        username, email, password=password
    )
    user.is_admin = True
    user.is_staff = True
    user.active = True
    user.save(using=self._db)
    return user

唯一性是由数据库上的约束集强制执行的(可能是因为models.py中的unique=True),所以这是引发错误的地方,而Django在尝试进行事务处理之前不会意识到这一点。

尽管您通常不希望电子邮件字段具有唯一性,但不一定是唯一的。

编辑:您可以像这样天真email=email来做一些更健壮(但完全可选)的事情:

email_field = self.model.get_email_field_name()
duplicate = self.filter(**{email_field: email})