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, есть три вещи, которые вы можете сделать:

  1. Настройте способ аутентификации. По умолчанию аутентификация осуществляется с помощью базы данных, в которой хранятся пароли. Вы можете аутентифицироваться по facebook/google и т.д. или по существующей базе данных пользователей - например, по ActiveDirectory, если вы работаете в сети Windows.

    .
  2. Создайте пользовательские разрешения, и на основе этих разрешений ограничьте, какие функции могут выполнять пользователи. По умолчанию, на каждую модель - django добавит базовые разрешения "can edit", "can delete", "can read". Вы можете создать свои собственные и затем проверить, есть ли у пользователя эти специфические разрешения.

  3. Вы можете хранить дополнительную информацию о пользователе, наряду с той, что обычно хранится в django. Есть два способа сделать это, в зависимости от того, насколько большая настройка вам нужна. Если все, что django предоставляет по умолчанию, работает для вас, и все, что вы хотите сделать, это хранить дополнительную информацию о пользователе, вы можете расширить модель пользователя - в предыдущих версиях это называлось созданием пользовательского профиля. Другая возможность - создать свою собственную модель пользователя, если вы хотите более глубокой настройки. Наиболее часто пользовательская модель пользователя используется, если вы хотите использовать адрес электронной почты в качестве имени пользователя.

В вашем случае, поскольку все, что вы хотите сделать, это хранить дополнительную информацию о пользователе, определите разрешение для клиента и продавца и с помощью создания Client и Vendor в качестве прокси-модели разделите их при использовании.

Вернуться на верх