从抽象类Django继承



我正在构建一个由三个用户角色组成的平台:管理员、创建者和品牌。我重新定义了一个默认的django用户,可以通过电子邮件登录。

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

我使这个类成为一个抽象类,以便能够添加新的类,从抽象类继承并重新定义它们的属性。

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)

我还添加了以下设置:

AUTH_USER_MODEL = 'users.PlatformAdmin'

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

users.Brand.groups: (fields.E304) Reverse accessor for 'Brand.groups' clashes with reverse accessor for 'Creator.groups'.
HINT: Add or change a related_name argument to the definition for 'Brand.groups' or 'Creator.groups'.
users.Brand.groups: (fields.E304) Reverse accessor for 'Brand.groups' clashes with reverse accessor for 'PlatformAdmin.groups'.
HINT: Add or change a related_name argument to the definition for 'Brand.groups' or 'PlatformAdmin.groups'.
users.Brand.user_permissions: (fields.E304) Reverse accessor for 'Brand.user_permissions' clashes with reverse accessor for 'Creator.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'Brand.user_permissions' or 'Creator.user_permissions'.
users.Brand.user_permissions: (fields.E304) Reverse accessor for 'Brand.user_permissions' clashes with reverse accessor for 'PlatformAdmin.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'Brand.user_permissions' or 'PlatformAdmin.user_permissions'.
users.Creator.groups: (fields.E304) Reverse accessor for 'Creator.groups' clashes with reverse accessor for 'Brand.groups'.
HINT: Add or change a related_name argument to the definition for 'Creator.groups' or 'Brand.groups'.
users.Creator.groups: (fields.E304) Reverse accessor for 'Creator.groups' clashes with reverse accessor for 'PlatformAdmin.groups'.
HINT: Add or change a related_name argument to the definition for 'Creator.groups' or 'PlatformAdmin.groups'.
users.Creator.user_permissions: (fields.E304) Reverse accessor for 'Creator.user_permissions' clashes with reverse accessor for 'Brand.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'Creator.user_permissions' or 'Brand.user_permissions'.
users.Creator.user_permissions: (fields.E304) Reverse accessor for 'Creator.user_permissions' clashes with reverse accessor for 'PlatformAdmin.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'Creator.user_permissions' or 'PlatformAdmin.user_permissions'.
users.PlatformAdmin.groups: (fields.E304) Reverse accessor for 'PlatformAdmin.groups' clashes with reverse accessor for 'Brand.groups'.
HINT: Add or change a related_name argument to the definition for 'PlatformAdmin.groups' or 'Brand.groups'.
users.PlatformAdmin.groups: (fields.E304) Reverse accessor for 'PlatformAdmin.groups' clashes with reverse accessor for 'Creator.groups'.
HINT: Add or change a related_name argument to the definition for 'PlatformAdmin.groups' or 'Creator.groups'.
users.PlatformAdmin.user_permissions: (fields.E304) Reverse accessor for 'PlatformAdmin.user_permissions' clashes with reverse accessor for 'Brand.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'PlatformAdmin.user_permissions' or 'Brand.user_permissions'.
users.PlatformAdmin.user_permissions: (fields.E304) Reverse accessor for 'PlatformAdmin.user_permissions' clashes with reverse accessor for 'Creator.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'PlatformAdmin.user_permissions' or 'Creator.user_permissions'.

我不知道我做错了什么,也不知道如何解决这个问题。

我认为您必须添加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'

我认为你必须遵循这个方法。

在Meta类的AbstractUser中,abstract=True正在产生问题。此外,您还在两个位置重复电子邮件字段(AbstractUser和Creator(
或者
只保留一个用户模型(PlatformAdmin(。将Creator和Brand转换为正常模式。否则PermissionsMixin类中的字段将发生冲突(相同的字段在多个位置重复(。

最新更新