django - Django UNIQUE 约束失败:accounts_users.email
问题描述
我正在使用 Django 3.2.3 设置一个多用户帐户。第一个模型完美运行。它为登录生成令牌。但是继承的模型“公司”产生错误 UNIQUE 约束失败:accounts_users.email
我会很感激你的帮助。
我的模特
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if email is None:
raise TypeError('Users should have a Email')
user = self.model(email=self.normalize_email(email))
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, **extra_fields):
if password is None:
raise TypeError('Password should not be none')
user = self.create_user(email, password)
user.is_superuser = True
user.is_staff = True
user.save()
return user
def get_by_natural_key(self, email):
return self.get(email=email)
class Users(AbstractBaseUser, PermissionsMixin):
is_company = models.BooleanField(default=False)
is_verified = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
email = models.EmailField(db_index=True, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
objects = UserManager()
def tokens(self):
refresh = RefreshToken.for_user(self)
return {
'refresh': str(refresh),
'access': str(refresh.access_token)
}
def natural_key(self):
return (self.first_name, self.last_name)
def __str__(self):
return self.email
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
class CompanyUserManager(BaseUserManager):
def create_company(
self, first_name, last_name,
name_of_company, company_logo,
email, password=None, **extra_fields
):
if email is None:
raise TypeError('Users should have a Email')
user = Company(first_name=first_name, last_name=last_name,
email=self.normalize_email(email),
name_of_company=name_of_company,
company_logo=company_logo
)
user.set_password(password)
user.save()
return user
class Company(Users, PermissionsMixin):
first_name = models.CharField(db_index=True, max_length=100)
last_name = models.CharField(db_index=True, max_length=100)
name_of_company = models.CharField(db_index=True, max_length=255)
company_logo = models.ImageField(upload_to='./paqs/comp_logo', db_index=True)
USERNAME_FIELD = 'email'
objects = CompanyUserManager()
def tokens(self):
refresh = RefreshToken.for_user(self)
return {
'refresh': str(refresh),
'access': str(refresh.access_token)
}
def __str__(self):
return self.name_of_company
def get_full_name(self):
return (self.first_name+' '+self.last_name)
def get_short_name(self):
return self.first_name
@receiver(post_save, sender=Company)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
我的序列化器
class CompanyRegistrationSerializer(serializers.ModelSerializer):
password = serializers.CharField(
max_length=64,
min_length=8,
write_only=True
)
company_logo = Base64ImageField(max_length=None, use_url=True)
token = serializers.CharField(max_length=255, read_only=True)
class Meta:
model = Company
fields = ['first_name','last_name','name_of_company', 'company_logo', 'email', 'password', 'token']
def validate(self, attrs):
first_name = attrs.get('first_name', '')
last_name = attrs.get('last_name', '')
name_of_company = attrs.get('name_of_company', '')
company_logo = attrs.get('company_logo', '')
email = attrs.get('email', '')
return attrs
def create(self, validated_data):
user = super().create(validated_data)
if not user.is_company:
user.is_company = True
user.save()
return Company.objects.create_company(**validated_data)
class UsersRegistrationSerializer(serializers.ModelSerializer):
password = serializers.CharField(
max_length=64,
min_length=8,
write_only=True
)
token = serializers.CharField(max_length=255, read_only=True)
class Meta:
model = Users
fields = ['email', 'password', 'token']
def create(self, validated_data):
return Users.objects.create_user(**validated_data)
我的观点
class CompanyRegisterView(generics.GenericAPIView):
serializer_class = CompanyRegistrationSerializer
renderer_classes = (UserRenderer,)
permission_classes = (AllowAny,)
# authentication_classes = (TokenAuthentication,)
def post(self, request):
user = request.data
serializer = self.serializer_class(data=user)
serializer.is_valid(raise_exception=True)
serializer.save()
user_data = serializer.data
return Response(user_data, status=status.HTTP_201_CREATED)
谢谢
解决方案
推荐阅读
- xml - Android Studio 3.2.1 没有正确缩进布局 XML
- c# - 扁平化类属性中的字典
- javascript - 如何在 Angular 6+ 中正确使用 3rd 方 javascript 库
- python - 在 python 中的类方法中打印不起作用
- php - 如何从 fopen/file_get_contents 运行 PHP 代码?
- c# - 查看带有区域的组件 taghelper
- php - 默认情况下删除单选按钮在zend中选中
- java - 检查硒测试,如果所有这些 div 都有文本
- flutter - 如何在 Flutter 上的聊天气泡中实现时间文本换行行为
- java - servlet 不允许打开 form-login-page