#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)