首页 > 解决方案 > django 中的用户模型未扩展到其他模型

问题描述

我使用 AbstractBaseUser 和 BaseUserManager 创建了用户模型。用户模型与 OneToOneField 其他三个模型(Employee、WorkExperience、Eduction)相连。如果我创建一个超级用户,则该用户将扩展到所有三个模型。但是,如果我创建员工用户或管理员用户,则该用户仅扩展到 Employee 模型而不是其他三个模型。

模型.py:

class UserProfileManager(BaseUserManager):
    """
    Creates and saves a User with the given email and password.
    """
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
            username=username
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_staffuser(self, email,username, password):
        user = self.create_user(
            email,
            password=password,
            username=username
        )
        user.is_staff = True
        user.is_admin = True
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email,
            password=password,
            username=username
        )
        user.is_staff = True
        user.is_admin = True
        user.save(using=self._db)
        return user


class UserProfile(AbstractBaseUser):
    """
    Creates a customized database table for user
    """

    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    username = models.CharField(max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email',]

    objects = UserProfileManager()

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

class Employee(models.Model):
    """
    Create employee attributes
    """

    employee_user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    e_id = models.IntegerField(unique=True, null=True)
    first_name = models.CharField(max_length=128, null=True)
    last_name = models.CharField(max_length=128, null=True)
    .......
    @receiver(post_save, sender=UserProfile)
    def create_or_update_user_profile(sender, instance, created, **kwargs):
        if created:
            Employee.objects.create(employee_user=instance, email=instance.email)
        instance.employee.save()
    
    class WorkExperience(models.Model):
    """
    Stores employee previous work experiences
    """
    employee_user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    employee = models.ForeignKey('Employee', related_name='we_employee', on_delete=models.CASCADE, null=True)
    previous_company_name = models.CharField(max_length=128, null=True)
    job_designation = models.CharField(max_length=128, null=True)
    from_date = models.DateField(null=True)
    to_date = models.DateField(null=True)
    job_description = models.CharField(max_length=256, null=True)

    class Education(models.Model):
    """
    Stores employee education background
    """
    employee_user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    employee = models.ForeignKey('Employee', related_name='edu_employee', on_delete=models.CASCADE, null=True)
    institution_name = models.CharField(max_length=128, null=True)
    degree = models.CharField(max_length=128, null=True)
    passing_year = models.IntegerField(null=True)
    result = models.DecimalField(max_digits=5, decimal_places=2, null=True)

我需要将用户扩展到其他三个模型。我怎样才能做到这一点?

标签: pythondjango

解决方案


首先你没有将用户模型扩展到其他三个表,你已经创建了与用户模型的关系,如果你想继承它,你必须这样写

class Education (UserProfile):
    pass

推荐阅读