Django CheckConstraint验证失败:自定义用户模型约束异常求助
问题分析与解决方案
你的问题出在第一个CheckConstraint的逻辑设计错误,它强制要求所有用户必须同时满足is_superuser=False、is_staff=False、company__isnull=False,但员工(staff)和超级用户(superuser)显然不满足这个条件,所以无论创建哪种用户都会触发该约束的错误。
正确的约束逻辑设计
根据你的需求,应该用「合法情况的逻辑或」来构建约束,确保所有合法用户都能满足约束条件,同时限制非法情况:
- 普通用户(非staff且非superuser)必须绑定公司 → 合法用户要么是超级用户、要么是员工、要么绑定了公司
- 员工用户不能绑定公司 → 如果是员工,公司必须为空
- 超级用户不能绑定公司 → 如果是超级用户,公司必须为空
修改后的代码
class CustomUser(AbstractUser): ''' Custom User class, username and email are required. Company is required except for staff and super users ''' company = models.ForeignKey(Company, on_delete=models.PROTECT, null=True, blank=True) class Meta(AbstractUser.Meta): constraints = [ # 普通用户必须绑定公司:合法情况为「超级用户」「员工」「有公司的普通用户」之一 CheckConstraint( check=Q(is_superuser=True) | Q(is_staff=True) | Q(company__isnull=False), name="user_must_have_company_if_not_staff_or_superuser", ), # 员工不能绑定公司:如果是员工,公司必须为空 CheckConstraint( check=Q(is_staff=False) | Q(company__isnull=True), name="staff_cannot_have_company", ), # 超级用户不能绑定公司:如果是超级用户,公司必须为空 CheckConstraint( check=Q(is_superuser=False) | Q(company__isnull=True), name="superuser_cannot_have_company", ), ]
验证测试场景
- 创建员工用户:
CustomUser.objects.create(username='staffuser', is_staff=True, company=None)
满足所有约束:属于员工(符合第一个约束)、是员工且公司为空(符合第二个约束)、不是超级用户(符合第三个约束),无报错。 - 创建带公司的员工用户:会触发
staff_cannot_have_company约束错误,符合预期。 - 创建超级用户:
CustomUser.objects.create(username='superuser', is_superuser=True, company=None)
满足所有约束:属于超级用户(符合第一个约束)、不是员工(符合第二个约束)、是超级用户且公司为空(符合第三个约束),无报错。 - 创建普通用户(非staff非superuser):必须绑定公司,否则触发第一个约束错误,符合预期。
内容的提问来源于stack exchange,提问作者S.D.
相关产品推荐
相关产品推荐

