首页 > 解决方案 > Django如何让createsuperuser检查重复的电子邮件地址

问题描述

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

有没有办法让它像检查用户名一样检查电子邮件地址?

标签: djangodjango-models

解决方案


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

唯一性是由数据库中的约束集强制执行的(可能是因为unique=True在 models.py 中),所以这就是引发错误的地方,Django 直到尝试事务才意识到它。

如果您不希望它是唯一的,则电子邮件字段不一定必须是唯一的,尽管这是一种常见的做法。

email=email编辑:你可以做一些更健壮(但完全可选)的事情,而不是天真,像这样:

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

推荐阅读