Ошибка ограничения UNIQUE в проекте django

У меня есть приложение в django 1.11, где у меня есть учетные записи приложений для управления пользователями. Пользователю могут быть назначены роли, с которыми возникают проблемы при создании пользователя через менеджер.

При добавлении имени пользователя я получаю сообщение об ошибке:

IntegrityError at /accounts/add_user/

UNIQUE constraint failed: accounts_role.id

Вот моя модель:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('Email address'), unique=True)
    first_name = models.CharField(_('First name'), max_length=60, blank=True)
    last_name = models.CharField(_('Last name'), max_length=60, blank=True)
    roles = models.ManyToManyField(Role, unique=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    objects = UserManager()

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

Ниже приведен класс ролей:

class Role(models.Model):
    ADMIN = 1
    PLAYER = 2
    ROLE_CHOICES = (
        (ADMIN, 'admin'),
        (PLAYER, 'player'),
    )

    id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, default=2, primary_key=True, unique=False)

    def __str__(self):
        return self.get_id_display()

Вот менеджер:

class UserManager(BaseUserManager):
    def create_user(self, email, password):
        user = self.model(email=email, password=password)
        user.set_password(password)
        user.is_staff = False
        user.is_superuser = False
        user.save(using=self._db)
        role = Role.objects.create(id=2)
        user.roles.add(role)
        return user
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 120
1

Ответы 1

В create_user вы должны назначить одну или несколько существующих ролей новому пользователю, а не пытаться каждый раз создавать одну и ту же новую роль (всегда с одним и тем же первичным ключом, что явно нарушает ограничение уникальности).

Ваша модель Role определяет только две роли. Создайте их отдельно от процесса создания пользователя, а затем назначьте их:

def create_user(self, email, password):
    # (...)   
    role = Role.objects.get(id=2)
    user.roles.add(role)

Другие вопросы по теме