django - Inherit from abstract class Django
问题描述
I am building a platform with 3 users roles: Admin, Creator and Brand. I redefined a default django User to be able to login by email.
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
I made this class an abstract one to be able to add new classes, inherit from the Abstract class and redefine their attributes.
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)
I also add in settings.py following:
AUTH_USER_MODEL = 'users.PlatformAdmin'
Now when I run makemigrations it will give the following output:
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'.
I can't figure out what I am doing wrong and how to solve this issue.
解决方案
在 Meta 类的 AbstractUser 中,abstract=True 造成了问题。您也在 2 个地方(AbstractUser 和 Creator)重复电子邮件字段。
或者
只保留一个用户模型(PlatformAdmin)。将 Creator 和 Brand 转换为普通模型。否则 PermissionsMixin 类中的字段会发生冲突(相同的字段在多个地方重复)。
推荐阅读
- sql - 什么会导致 SQL equery 在相同的软件和硬件的不同 Oracle 机器上运行显着更长的时间
- python - 部署 pyqt5
- pycharm - 如何将 OpenVino setupvars.sh 添加到 PyCharm 项目中?
- javascript - ReactJS - 禁用组件
- javascript - 如何以更高效且错误更少的方式获取实时 json 数据?
- r - 在两个时间戳之间左加入 R
- ionic-framework - 离子头 - 有必要吗?如何使其滚动而不是固定
- python - 将 3D 切片绘制为热图
- r - 为什么'fill ='函数在ggplots中的boxplot中不起作用?
- scala - Monad for-comprehensions with implicit Monad 失败,使用继承?