Django: несколько типов пользователей с абстрактным базовым классом
Я хочу создать несколько типов пользователей и ролей в зависимости от типа пользователя при создании базовой абстрактной модели пользователя. Я пробовал что-то вроде этого:-
class CustomAccountManager(BaseUserManager):
.....
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=150, unique=True)
email = models.EmailField(_('email address'), unique=True)
firstname = models.CharField(max_length=150, blank=True, null=True)
....
class Meta:
abstract = True
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'firstname']
objects = CustomAccountManager()
class Client(User):
location = models.BooleanField(_(""), default=True)
history = models.BooleanField(
_(""), default=True)
ip = models.BooleanField(_(""), default=True)
def __str__(self):
return self.username
class Vendor(User):
Storesmtn = models.ImageField(
upload_to="Images", max_length=100000, default="default/default.png")
Storesmtn = models.ImageField(
upload_to="Images", max_length=100000, default="default/default.png")
Storesmtn = models.CharField(max_length=220, blank=False, unique=True)
когда я мигрирую, появляется следующая ошибка:-
users.Client.groups: (fields.E304) Reverse accessor for 'users.Client.groups' clashes with reverse accessor for 'users.Vendor.groups'.
HINT: Add or change a related_name argument to the definition for 'users.Client.groups' or 'users.Vendor.groups'.
users.Client.user_permissions: (fields.E304) Reverse accessor for 'users.Client.user_permissions' clashes with reverse accessor for 'users.Vendor.user_permissions'. HINT: Add or change a related_name argument to the definition for 'users.Client.user_permissions' or 'users.Vendor.user_permissions'.
users.Vendor.groups: (fields.E304) Reverse accessor for 'users.Vendor.groups' clashes with reverse accessor for 'users.Client.groups'.
HINT: Add or change a related_name argument to the definition for 'users.Vendor.groups' or 'users.Client.groups'.
users.Vendor.user_permissions: (fields.E304) Reverse accessor for 'users.Vendor.user_permissions' clashes with reverse accessor for 'users.Client.user_permissions'. HINT: Add or change a related_name argument to the definition for 'users.Vendor.user_permissions' or 'users.Client.user_permissions'.
Эта проблема возникла из-за наличия полей related_name="user_set"
и related_query_name="user"
, в Django нет нескольких пользователей - есть только один пользователь, а затем на основе прав пользователи могут делать разные вещи.., Хотя, если разработчик решит перезаписать модель, следует изменить переменную AUTH_USER_MODEL
в Django setting.py и обратиться к модели наследования на основе модели пользователя, за сценой, related name
следует имя нового класса.
Если вы хотите настроить поведение пользователя в django, есть три вещи, которые вы можете сделать:
Настройте способ аутентификации. По умолчанию аутентификация осуществляется с помощью базы данных, в которой хранятся пароли. Вы можете аутентифицироваться по facebook/google и т.д. или по существующей базе данных пользователей - например, по ActiveDirectory, если вы работаете в сети Windows.
.Создайте пользовательские разрешения, и на основе этих разрешений ограничьте, какие функции могут выполнять пользователи. По умолчанию, на каждую модель - django добавит базовые разрешения "can edit", "can delete", "can read". Вы можете создать свои собственные и затем проверить, есть ли у пользователя эти специфические разрешения.
Вы можете хранить дополнительную информацию о пользователе, наряду с той, что обычно хранится в django. Есть два способа сделать это, в зависимости от того, насколько большая настройка вам нужна. Если все, что django предоставляет по умолчанию, работает для вас, и все, что вы хотите сделать, это хранить дополнительную информацию о пользователе, вы можете расширить модель пользователя - в предыдущих версиях это называлось созданием пользовательского профиля. Другая возможность - создать свою собственную модель пользователя, если вы хотите более глубокой настройки. Наиболее часто пользовательская модель пользователя используется, если вы хотите использовать адрес электронной почты в качестве имени пользователя.
В вашем случае, поскольку все, что вы хотите сделать, это хранить дополнительную информацию о пользователе, определите разрешение для клиента и продавца и с помощью создания Client
и Vendor
в качестве прокси-модели разделите их при использовании.