#django #django-rest-framework
Вопрос:
Я настраиваю многопользовательскую учетную запись с помощью Django 3.2.3. Первая модель работает идеально. Он генерирует токены для входа в систему. Однако унаследованная модель «компания»выдает ошибку, УНИКАЛЬНОЕ ограничение не выполнено: 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)
My view
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)
Спасибо