내 Django 앱에는 Retailer와 Customer의 두 가지 모델이 있습니다. 둘 다 모델 필드는 다르지만 인증을위한 공통 필드는 이메일과 비밀번호입니다. 그래서 저는 User Model Inheritance를 사용했습니다. 이것은 내 코드입니다.
상속 이유 : 토큰 인증을 구현하고 싶습니다
models.py
class User(AbstractUser):
email = models.EmailField(_('email address'), unique=True)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def __str__(self):
return self.email
class Retailer(User, PermissionsMixin):
name = models.CharField(max_length=255)
phoneNUMBER = models.CharField(max_length=10)
verificationSTATUS = models.BooleanField(default=False)
dateJOINED = models.DateField(default=timezone.now)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name', 'phoneNUMBER',]
objects = RetailerManager()
def __str__(self):
return self.name
class Customer(User, PermissionsMixin):
name=models.CharField( max_length=255, null=False,)
phone_Number=models.CharField( max_length=10, null=False)
address=models.TextField(max_length=255,null=False)
pin_Code=models.CharField( max_length=6,null=False )
anniversary_Date=models.DateField(blank=True,null=True)
hobbies=models.TextField(blank=True,null=True)
profession=models.CharField(blank=True,max_length=20,null=True,)
created_At=models.DateField(default=timezone.now)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name', 'phoneNUMBER', 'address', 'pin_Code']
objects = CustomerManager()
def __str__(self):
return (self.name)
managers.py
class UserManager(BaseUserManager):
"""
Custom user model manager where email is the unique identifiers
for authentication instead of usernames.
"""
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 Email must be set'))
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **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)
extra_fields.setdefault('is_active', 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, password, **extra_fields)
class RetailerManager(BaseUserManager):
def create_retailer(self, name, email, phoneNUMBER, password=None):
if email is None:
raise TypeError('User must have an email address.')
retailer = Retailer(
email=self.normalize_email(email),
name=name,
phoneNUMBER=phoneNUMBER
)
retailer.set_password(password)
retailer.save()
return retailer
class CustomerManager(BaseUserManager):
def create_customer(self, name, email, phone_Number, address, pin_Code, password=None, **extra_fields):
if email is None:
raise TypeError('User must have an email address.')
customer = Customer(
email=self.normalize_email(email),
name=name,
phone_Number=phone_Number,
address=address,
pin_Code=pin_Code,
)
customer.set_password(password)
customer.save()
return customer
내가 이것을 실행할 때
Retailer.objects.create(email="[email protected]", name="John Doe", password="john@123", phoneNUMBER = "90909090")
이 오류가 발생합니다.
django.db.utils.IntegrityError: UNIQUE constraint failed: retailer_user.username
또한 이것을 실행하면
Customer.objects.create(email="[email protected]", name="Jane Doe", password="jane@123")
같은 오류가 발생합니다
django.db.utils.IntegrityError: UNIQUE constraint failed: retailer_user.username
아무도 내가 뭘 잘못하고 있는지 말할 수 있습니까? 이것이 최선의 접근 방식입니까? 또한 소매 업체와 고객 모두에 대해 토큰 인증을 구현하려면 어떻게해야합니까?
대신 인증을 사용 하지 않으 려면 User
에서 상속해야합니다 .AbstractBaseUser
AbstractUser
email
username
username
하여 오류를 제기 필드에서 온다 AbstractUser
클래스입니다.
class User(AbstractBaseUser):
email = models.EmailField(_('email address'), unique=True)
first_name = models.CharField(_('first name'), max_length=150, blank=True)
last_name = models.CharField(_('last name'), max_length=150, blank=True)
email = models.EmailField(_('email address'), blank=True)
is_staff = models.BooleanField(
'staff status',
default=False,
help_text='Designates whether the user can log into this admin site.',
)
is_active = models.BooleanField(
'active',
default=True,
help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.',
)
date_joined = models.DateTimeField('date joined', default=timezone.now)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = ['email']
objects = UserManager()
def get_full_name(self):
"""
Return the first_name plus the last_name, with a space in between.
"""
full_name = '%s %s' % (self.first_name, self.last_name)
return full_name.strip()
def get_short_name(self):
"""Return the short name for the user."""
return self.first_name
def __str__(self):
return self.email
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다