从抽象类Django继承

时间:2020-07-28 09:22:05

标签: django

我正在构建一个具有3个用户角色的平台:管理员,创建者和品牌。我重新定义了默认的django用户,使其能够通过电子邮件登录。

D/SystemWebChromeClient: http://localhost/vendor-es2015.js: Line 44076 : ERROR [object Object]
I/chromium: [INFO:CONSOLE(44076)] “ERROR [object Object]”, source: http://localhost/vendor-es2015.js (44076)

我将该类作为抽象类,以便能够添加新类,从Abstract类继承并重新定义其属性。

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=32, unique=True)
    first_name = models.CharField(max_length=32, blank=True)
    last_name = models.CharField(max_length=64, blank=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    location = models.CharField(max_length=120, blank=True)
    bio = models.TextField(blank=True)

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    class Meta:
        abstract = True

    def __str__(self):
        return self.email

我还添加了settings.py,如下:

class PlatformAdmin(AbstractUser):
    pass


class Creator(AbstractUser):
    email = models.EmailField(max_length=32, unique=True, error_messages={
        'unique': "A customer with that email already exists.",
    })

class Brand(AbstractUser):
    name = models.CharField(max_length=64)

现在,当我运行makemigrations时,它将给出以下输出:

AUTH_USER_MODEL = 'users.PlatformAdmin'

我无法弄清楚自己在做什么以及如何解决此问题。

2 个答案:

答案 0 :(得分:0)

我认为您必须添加3个这样的字段:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=32, unique=True)
    first_name = models.CharField(max_length=32, blank=True)
    last_name = models.CharField(max_length=64, blank=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    location = models.CharField(max_length=120, blank=True)
    bio = models.TextField(blank=True)

    # add this 3 fields
    is_admin = models.BooleanField(default=False)
    is_creater = models.BooleanField(default=False)
    is_brand = models.BooleanField(default=True)

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    class Meta:
        abstract = True

    def __str__(self):
        return self.email

AUTH_USER_MODEL = 'users.CustomUserModel'

我认为您必须遵循这种方法。

答案 1 :(得分:0)

在类Meta中的AbstractUser内,abstract = True造成了问题。您还要在两个地方(AbstractUser和Creator)重复发送电子邮件字段。

仅保留一个用户模型(PlatformAdmin)。将创作者和品牌转换为正常模型。否则,PermissionsMixin类中的字段会发生冲突(同一字段在多个位置重复)。

相关问题