You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django多租户应用中默认货币唯一性约束失效问题排查

多租户应用默认货币唯一性约束失效问题

我开发了一个支持多币种的多租户应用,简化后的Currency模型代码如下:

class Currency(models.Model):
    multi_tenant_company = models.ForeignKey(MultiTenantCompany, on_delete=models.CASCADE)
    is_default_currency = models.BooleanField(default=False)

需求为每个multi_tenant_company仅能设置一个默认货币,我尝试添加如下数据库唯一性约束但失效:

class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['is_default_currency', 'multi_tenant_company'],
                condition=Q(is_default_currency=True),
                name='unique_is_default_currency')
        ]

请问我遗漏了什么配置?


问题原因及解决方法

你的约束逻辑写错了:你把is_default_currency加入了fields列表,结合condition=Q(is_default_currency=True),实际生效的约束是当is_default_currency为True时,(True, multi_tenant_company)这个组合唯一——但这不是我们要的效果,我们需要的是每个multi_tenant_company只能存在一条is_default_currency=True的记录,不需要把布尔字段加入唯一组合。

正确的约束写法应该只指定multi_tenant_company作为唯一字段,配合条件过滤:

class Meta:
    constraints = [
        models.UniqueConstraint(
            fields=['multi_tenant_company'],
            condition=Q(is_default_currency=True),
            name='unique_default_currency_per_company'
        )
    ]

额外注意事项:

  • 执行数据库迁移前,要先清理现有数据,确保每个租户最多只有一条默认货币记录,否则迁移会报错
  • 数据库约束只能保证底层数据合规,建议在业务代码层也添加校验逻辑,比如设置新默认货币时,先将该租户原默认货币的is_default_currency设为False

内容的提问来源于stack exchange,提问作者S.D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:32:08