【问题标题】:UNIQUE constraint failed in django projectDjango 项目中的 UNIQUE 约束失败
【发布时间】:2019-07-17 01:57:05
【问题描述】:

我在 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 django orm m2m django-managers


    【解决方案1】:

    create_user 中,您应该为新用户分配一个或多个现有角色,而不是每次都尝试创建相同的新角色(始终使用相同的主键,这显然违反了唯一性约束)。

    您的Role 模型只定义了两个角色。将它们与用户创建过程分开创建,然后分配:

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

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 2017-03-04
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多