функция create_user в CustomUserManager не работала

#python #django #api #django-rest-framework

Вопрос:

Я создаю пользовательскую модель пользователя и менеджера, но функция 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
 

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

1. В чем именно заключается проблема? Выводит ли он ошибку, не сохраняется ли она в базе данных? Пожалуйста, укажите информацию о том, что шляпа не работает.

2. Я не получил ошибки, но мой пользователь не сохранил ее в базе данных. Я выясняю, что функция create_user не запускается во время создания пользователем.

Ответ №1:

В сериализаторе вы не вызываете create_user метод. При создании экземпляра User класса django не создает запись в БД автоматически. Вам нужно позвонить save() или create_user() вручную:

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