首页 > 解决方案 > CustomUserManager 中的函数 create_user 不起作用

问题描述

我创建了一个自定义用户模型和管理器,但管理器中的 create_user 函数不起作用。我的错是什么?

这是我的模型:

class User(AbstractUser):

email               = models.EmailField(null = True, blank = True)
is_superuser        = models.BooleanField(default=False)
is_admin            = models.BooleanField(default=False)
is_active           = models.BooleanField(default=True)
phone_number        = models.BigIntegerField(unique=True)
is_owner            = models.BooleanField(default=False)
is_advisor          = models.BooleanField(default=False)
name                = models.CharField(max_length=40, null = True, blank = True)
image               = models.ImageField(blank = True, null=True)
data_join           = models.DateTimeField(default = timezone.now)
code_agency         = models.IntegerField(null=True, blank=True, default=0)
opt                 = models.IntegerField(null = True, blank = True)
is_verified         = models.BooleanField(default  = False)



USERNAME_FIELD = 'phone_number'
REQUIRED_FIELDS = []

objects = UserCustomManager()

def __str__(self):
    return str(self.phone_number)

class Meta:
    verbose_name = 'user'
    verbose_name_plural = 'users'

这是我的经理:

class UserCustomManager(BaseUserManager):

use_in_migrations = True

def _create_user(self, phone_number, **extra_fields):
    if not phone_number:
        raise ValueError('The given phonenumber must be set')
    print("""
    ========================
    ========================
    ========================
    """)
    user = self.model(phone_number=phone_number, username=phone_number, **extra_fields)
    user.set_password("green")
    # Token.objects.create(user=user)
    user.save(using=self._db)
    return user
    



def create_user(self, phone_number, **extra_fields):
    extra_fields.setdefault('is_staff', False)
    extra_fields.setdefault('is_superuser', False)
    digits = "0123456789"
    print("""
    ========================
    ========================
    ========================
    """)
    OTP = ""
    for i in range(4) :
        OTP += digits[math.floor(random.random() * 10)]
    extra_fields.setdefault('opt', OTP)
    return self._create_user(phone_number, **extra_fields)



def create_superuser(self, phone_number, **extra_fields):
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)


    if extra_fields.get('is_staff') is not True:
        raise ValueError('Superuser must have is_staff=True.')
    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True.')

    return self._create_user(phone_number, **extra_fields)

我在我的代码中设置了一些打印,当我想从视图创建新用户时,我发现 create_user 没有运行,但是当我想从终端创建超级用户时,其他函数(如 create_superuser 或 _create_user)工作。

最后这是我在序列化程序中的代码:

class RegestrationSerializers(serializers.ModelSerializer):
class Meta:
    model = User
    fields = [
            'phone_number',
        ]

def save(self):
    account = User(
        phone_number = self.validated_data['phone_number'],
    )
    account.is_verified = False
    return account

标签: pythondjangoapidjango-rest-framework

解决方案


在序列化程序中,您没有调用create_user方法。当您实例化User类时,django 不会自动在 DB 中创建记录。您需要调用save()create_user()手动:

def save(self):
    account = User.objects.create_user(
        phone_number = self.validated_data['phone_number'], is_verified=False
    )
    return account

推荐阅读