Пользовательская модель пользователя Django не использует менеджер моделей при создании обычных пользователей

#django #django-models #django-rest-framework #django-views

Вопрос:

Я пытаюсь создать пользователя из набора моделей Django rest framework. (Однако я также пытался сделать то же самое с обычной формой модели Django. В обоих случаях пользовательская модель пользователя не использует функцию create_user из менеджера моделей.

Мои коды следующие:

Менеджер моделей

 class CustomUserManager(BaseUserManager):  def create_user(self, email, phone, full_name, **other_fields):  email = self.normalize_email(email)  if not email:  raise ValueError("User must have an email")  if not full_name:  raise ValueError("User must have a full name")  if not phone:  raise ValueError("User must have a phone number")   user = self.model(  email=self.normalize_email(email),  phone=phone,  full_name=full_name,  is_active=True,  )  other_fields.setdefault('is_active', True)  user.set_password(phone)  user.save(using=self._db)  return user   def create_superuser(self, email, phone, full_name, password=None, **other_fields):  if not email:  raise ValueError("User must have an email")  if not password:  raise ValueError("User must have a password")  if not full_name:  raise ValueError("User must have a full name")  if not phone:  raise ValueError("User must have a phone number")   user = self.model(  email=self.normalize_email(email),  full_name = full_name,  phone = phone  )  user.set_password(password) # change password to hash  other_fields.setdefault('is_staff', True)  other_fields.setdefault('is_superuser', True)  other_fields.setdefault('is_active', True)  user.save(using=self._db)  return user  

Модель:

 class CustomUserModel(AbstractBaseUser, PermissionsMixin, AbstractModel):  email = models.EmailField(unique=True)  username = models.CharField( max_length=150, unique=True, null=True, blank=True)  phone = PhoneNumberField(unique=True)  full_name = models.CharField(max_length=50, null=True, blank=True)  is_active = models.BooleanField(default=False)  is_staff = models.BooleanField(default=False)   objects = CustomUserManager()   USERNAME_FIELD = 'email'  REQUIRED_FIELDS = ['phone', 'full_name']   class Meta:  verbose_name = 'User'  verbose_name_plural = 'Users'   def __str__(self):  return f'{self.username} - {self.email}'   def save(self, *args, **kwargs):  if not self.username:  uid = str(uuid4()).split('-')[1].upper()  today = str(date.today()).replace('-', '').swapcase()  splitted_uname = self.full_name.split(' ')[0][:2].upper()  self.username = f'{splitted_uname}-{uid}{today}'  super(CustomUserModel, self).save(*args, **kwargs)  

Набор представлений фреймворка Django REST

 class UserBaseViewSet(viewsets.ModelViewSet):  allowed_methods = ('GET', 'POST', 'PATCH')  serializer_class = serializers.UserBaseListSerializer  queryset = CustomUserModel.objects.all()  permission_classes = [IsProfileOwnerOrReadOnly, ]  lookup_field = 'username'   def get_serializer_class(self):  if self.action == 'retrieve':  return serializers.UserBaseDetailSerializer  return super().get_serializer_class()  

При создании суперпользователей из командной строки это работает идеально. Чего мне не хватает в этом процессе? Я отлаживаю процесс, но класс модели никоим образом не использует функцию create_user менеджера.

Комментарии:

1. Вам придется переопределить create UserBaseListSerializer , чтобы позвонить менеджеру create_user

2. Можете ли вы показать мне пример кода.

Ответ №1:

Вам придется переопределить create UserBaseListSerializer , чтобы позвонить менеджеру create_user :

 class UserBaseListSerializer(serializers.ModelSerializer):  ...  def create(self, validated_data):  return CustomUserModel.objects.create_user(**validated_data)