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

如何解决Django+PostgreSQL中trade_id约束数量错误问题

解决Django迁移时ValueError: Found wrong number (2) of constraints问题

问题根源

你遇到的问题是因为Inventory模型里的trade字段是OneToOneField——Django会自动为该字段在数据库层面创建唯一约束;同时你又在Meta类中手动添加了unique_together = [('trade',)],这会再生成一个重复的唯一约束。最终数据库里trade_id存在两个重复的唯一约束,导致Django迁移时检测到约束数量不匹配,抛出异常。

解决步骤

1. 删除数据库中多余的唯一约束

通过psql连接数据库,执行SQL命令删除unique_together生成的那个约束(通常名称带随机后缀,比如你的accounting_inventory_trade_id_5cf7c1af_uniq):

ALTER TABLE accounting_inventory DROP CONSTRAINT accounting_inventory_trade_id_5cf7c1af_uniq;

2. 修正模型代码

打开models.py,移除Meta类中多余的unique_together配置——OneToOneField已经天然保证了trade字段的唯一性,不需要额外配置:

class Inventory(TimestampedModel):
    # ... 其他字段保持不变
    class Meta:
        verbose_name_plural = "Inventory"
        # 移除下面这行多余配置
        # unique_together = [('trade',), ]

3. 同步迁移状态

  • 尝试生成新的迁移文件:
python manage.py makemigrations
  • 如果提示无变更,或之前的迁移文件存在冲突,用--fake参数让Django标记迁移状态为已执行,避免重复操作:
python manage.py migrate --fake
  • 如果生成了新的迁移文件,直接执行迁移即可:
python manage.py migrate

验证

执行完上述步骤后,再次查询数据库表的约束,应该只剩下OneToOneField自动生成的accounting_inventory_trade_id_key约束,后续迁移操作即可正常进行。

内容的提问来源于stack exchange,提问作者Florent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:57:20