首页 > 解决方案 > 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.

标签: django

解决方案


在 Meta 类的 AbstractUser 中,abstract=True 造成了问题。您也在 2 个地方(AbstractUser 和 Creator)重复电子邮件字段。
或者
只保留一个用户模型(PlatformAdmin)。将 Creator 和 Brand 转换为普通模型。否则 PermissionsMixin 类中的字段会发生冲突(相同的字段在多个地方重复)。


推荐阅读