如何解决基本用户表auth_user和allauths account_emailaddress中的电子邮件字段重复
我将Django 3.1.1与Django-allauth结合使用来处理用户身份验证。
创建用户会在以下3个表中进行输入:
- auth_user
- account_emailaddress
- account_email确认
由于我的应用程序中不需要用户名,因此我从基本用户模型继承来接受电子邮件地址而不是用于身份验证(here you can find the tutorial I used for this):
from django.contrib.auth.models import AbstractUser,BaseUserManager
from django.db import models
from django.utils.translation import ugettext_lazy as _
class UserManager(BaseUserManager):
"""Define a model manager for User model with no username field."""
use_in_migrations = True
def _create_user(self,email,password,**extra_fields):
"""Create and save a User with the given email and password."""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email,**extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self,password=None,**extra_fields):
"""Create and save a regular User with the given email and password."""
extra_fields.setdefault('is_staff',False)
extra_fields.setdefault('is_superuser',False)
return self._create_user(email,**extra_fields)
def create_superuser(self,**extra_fields):
"""Create and save a SuperUser with the given email and password."""
extra_fields.setdefault('is_staff',True)
extra_fields.setdefault('is_superuser',True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email,**extra_fields)
class User(AbstractUser):
"""User model."""
username = None
email = models.EmailField(_('email address'),unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
这就像一种魅力。但是我注意到此时将电子邮件地址存储在auth_user中绝对没有任何意义,因为allauth已经将它们存储在account_emailaddress中。
我注意到从account_emailaddress的字段用户到auth_user的外键已经存在:
class EmailAddress(models.Model):
user = models.ForeignKey(allauth_app_settings.USER_MODEL,verbose_name=_('user'),on_delete=models.CASCADE)
email = models.EmailField(unique=app_settings.UNIQUE_EMAIL,max_length=app_settings.EMAIL_MAX_LENGTH,verbose_name=_('e-mail address'))
是否有一种方法可以利用,以便我可以将电子邮件字段拖放到auth_user中(可能不必随后重写 manage.py createsuperuser 的命令)?
通常,更好的问题可能是:当基本用户表中已经存在一个字段时,为什么allauth将电子邮件地址存储在新表中?对此我该怎么办?甚至应该对此做些什么?
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。