#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