首页 > 解决方案 > 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)

谢谢

标签: djangodjango-rest-framework

解决方案


推荐阅读