Я студент Django: Я получаю ошибку ValueError при создании суперпользователя с помощью пользовательского класса User
Я работаю над проектом, который требует, чтобы человек создавал учетную запись, только если его другие данные, такие как имя пользователя, уже есть в базе данных. Для этого я создал пользовательский класс под названием Account и связал поле username через отношение OneToOne с Reg No в классе Student. Я вручную заполнил базу данных одной записью, чтобы иметь возможность создать суперпользователя, поскольку для создания учетной записи требовалась существующая запись Student. Но я получаю ошибку значения на терминале, как показано ниже:
(djangoenv) myMachine:~/Django9/eschool$ python3 manage.py createsuperuser
Email: ********@**.me
Username (Student.School_ID): 1
Password:
Password (again):
Traceback (most recent call last):
File "/home/biketi21/Django9/eschool/manage.py", line 22, in <module>
main()
File "/home/biketi21/Django9/eschool/manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
utility.execute()
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/core/management/__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/core/management/base.py", line 354, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 79, in execute
return super().execute(*args, **options)
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/core/management/base.py", line 398, in execute
output = self.handle(*args, **options)
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 157, in handle
validate_password(password2, self.UserModel(**fake_user_data))
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/db/models/base.py", line 485, in __init__
_setattr(self, field.name, rel_obj)
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 310, in __set__
super().__set__(instance, value)
File "/home/biketi21/anaconda3/envs/djangoenv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 215, in __set__
raise ValueError(
ValueError: Cannot assign "1": "Account.username" must be a "Student" instance.
Ниже приведен мой Models.py: Я использую базу данных MySQL в качестве бэкенда.
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
# Create your models here.
class Student(models.Model):
FirstName = models.CharField(max_length=50)
Surname = models.CharField(max_length=50)
Reg_No = models.CharField(max_length=11, unique=True)
National_ID = models.IntegerField(unique=True)
School_ID = models.AutoField(primary_key=True)
County = models.CharField(max_length=20)
Sub_County = models.CharField(max_length=50)
Course_Title = models.ForeignKey("Course", on_delete=models.CASCADE)
Admission_Date = models.DateField(auto_now=True)
def __str__(self):
return str(self.Reg_No)
class Course(models.Model):
Course_Title = models.CharField(max_length=100)
Course_ID = models.CharField(max_length=10)
Number_of_Semesters = models.IntegerField()
Total_Cost_of_Course = models.IntegerField()
def __str__(self):
return str(self.Course_ID)
class MyAccountManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError('Users must have an email address.')
if not username:
raise ValueError('Users must have a username.')
user = self.model(
email=self.normalize_email(email),
username=username,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name='email', max_length=60, unique=True)
username = models.OneToOneField(Student, unique=True, on_delete=models.CASCADE)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = MyAccountManager()
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
Любая помощь в решении этой проблемы будет принята с благодарностью.