首页 > 解决方案 > modelManager get_by_natural 密钥方法更改 USERNAME_FIELD 影响我的身份验证?

问题描述

我有一个自定义 User 模型,它继承自AbstractBaseUser定义 username_field = email 以便用户使用电子邮件登录。

class User(AbstractBaseUser):
email = models.EmailField(verbose_name="Email", unique=True)
username = models.CharField(max_length=100, unique=True)
last_name = models.CharField(max_length=100, blank=True, null=True)
first_name = models.CharField(max_length=100, blank=True, null=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)
is_site_administrator = models.BooleanField(default=False)
is_developer = models.BooleanField(default=False)
is_project_manager = models.BooleanField(default=False)
last_login = models.DateTimeField(verbose_name="Last Login", auto_now=True)
create_on = models.DateTimeField(verbose_name="Date Created", default=timezone.now)

# So that we will be working primarily with email and not username
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username"]

objects = UserManager()

由于 objects = UserManager() 并且这个包含一个 get_by_natural_key 方法,如下所示:

    def get_by_natural_key(self, username):
        return self.get(username=username)

现在,而不是使用电子邮件登录,它使用用户名登录。请注意,userManager 像这样从 BaseUserManager 继承class UserManager(BaseUserManager): 有人可以向我解释这里发生了什么。问题是来自继承还是 get_by_natural_key() 本身?

标签: djangodjango-models

解决方案


推荐阅读