【问题标题】:Django Custom User Model is not using The model manager while creating normal usersDjango 自定义用户模型在创建普通用户时未使用模型管理器
【发布时间】:2021-12-13 23:17:09
【问题描述】:

我正在尝试从 Django 休息框架的 ModelViewset 创建一个用户。 (但是,我也尝试对常规 Django 的模型表单做同样的事情。在这两种情况下,CustomUser 模型都没有使用模型管理器中的 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 Framework 的 ViewSet

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 函数。

【问题讨论】:

  • 您必须覆盖 create of UserBaseListSerializer 才能调用经理的 create_user
  • 你能给我看看示例代码吗?

标签: django django-models django-rest-framework django-views


【解决方案1】:

您必须覆盖 createUserBaseListSerializer 才能致电经理的 create_user

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

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 2013-05-12
    • 1970-01-01
    • 2019-01-12
    • 2013-12-23
    • 1970-01-01
    • 2019-09-26
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多