Я студент 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

Любая помощь в решении этой проблемы будет принята с благодарностью.

Вернуться на верх