每次我创建超级用户时,Django 都会保存用户,但会抛出用户已经存在的错误,即使它从未存在过

问题描述 投票:0回答:0

我对高级 Django 以及使用 Django 4.2 和 PostGreSql 9.5 与 PgAdmin4 相当陌生。我正在尝试创建一个网站,用户可以在其中使用电子邮件和密码登录。我创建了这样的模型:

class Users(AbstractBaseUser):
    id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)
    email = models.EmailField(db_index=True, unique=True, max_length=250, blank=True, null=True)
    is_email_verified = models.BooleanField(default=False, help_text='this designates if the user\' email is verified')
    is_active = models.BooleanField(default=True, help_text='this designates if the user is active')
    is_staff = models.BooleanField(default=False, help_text='this designates if the user is staff or not')
    password = models.CharField(max_length=200, verbose_name='password of user')
    is_superuser = models.BooleanField(default=False, help_text='this designates if the user is superuser or not')
    last_login = models.DateTimeField(verbose_name='Last login of user', auto_now_add=True)
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='Time user was created')

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        unique_together = ['id', 'email']
    

    objects = UserManager() 

我的用户管理类是这样的:

class UserManager(BaseUserManager):
   def _create_user(self, email, password=None, **kwargs):
       if not email:
           raise ValueError('Email must be provided')
       user = self.model(
           email = self.normalize_email(email), 
           **kwargs
       )
       user.set_password(password)
       user.save(using=self._db)
       return user 
   
   def create_user(self, email, password=None, **kwargs):
       kwargs.setdefault('is_active', True)
       kwargs.setdefault('is_superuser', False)
       kwargs.setdefault('is_staff', False)
       user = self.model(
           email=self.normalize_email(email),
           password=password,
           **kwargs
       ) 

       user.save()
       return self._create_user(email, password, **kwargs)
   
   def create_superuser(self, email, password=None, **kwargs):
       kwargs.setdefault('is_active', True)
       kwargs.setdefault('is_staff', True)
       kwargs.setdefault('is_superuser', True)
       user = self.model(
           email=self.normalize_email(email),
           password=password,
           **kwargs
       )

       user.save()
       return self._create_user(email, password, **kwargs)

有人告诉我,如果我想验证电子邮件而不是用户名,我应该创建一个自定义后端。我的自定义后端看起来像这样:

后端.py

class CaseSensitiveModelBackend(ModelBackend):
    def authenticate(self, request, username, password, **kwargs):
        UserModel = get_user_model()

        if not username:
            username = kwargs.get(UserModel.USERNAME_FIELD)

        try:
            case_insensitive_username_field = '{}__iexact'.format(UserModel.USERNAME_FIELD)
            user = UserModel._default_manager.get(**{case_insensitive_username_field: username})
            success = user.check_password(password)
            if success:
                return user
        except UserModel.DoesNotExist:
           return None
        
        

    def get_user(self, user_id):
        return 

然而在创建迁移和迁移之后,当我尝试创建一个超级用户时,它告诉我超级用户已经存在,即使数据库是一个新的并且里面什么都不存在,同时仍然抛出这个错误:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "bloggers_users_email_key" DETAIL:  Key (email)=([email protected]) already exists.
此错误在用户已保存到数据库后立即出现

我也试过用所谓的已保存用户登录到管理员,但它抛出了一个区分大小写的错误。

我很困惑,请谁能帮我理解吗?

django django-models postgresql-9.5 pgadmin-4 custom-backend
© www.soinside.com 2019 - 2024. All rights reserved.