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

Django5+MySQL中BOM表结构与联合主键的ORM实现问题

问题分析与解决方案

表结构设计问题

你的核心问题出在BomLine的主键设置上:

  • 把designator设为primary_key=True会强制它全局唯一,这和你“不同BOM中允许重复designator”的业务需求冲突,是错误的实现方式。
  • Django ORM确实不支持复合主键,但可以通过单主键+联合唯一约束替代,这是符合Django最佳实践的,你的业务设计本身没问题,只是模型实现有误。

MySQL完全适用该场景

你遇到的自动添加id字段后默认值报错,不是MySQL的问题,大概率是Django与MySQL的配置或迁移细节问题,和场景适配无关。

修正后的模型代码

class Bom(models.Model):
    bom = models.AutoField(primary_key=True)
    bompart = models.ForeignKey(Part, on_delete=models.CASCADE)
    revision = models.CharField(max_length=1)

class BomLine(models.Model):
    bom = models.ForeignKey(Bom, on_delete=models.CASCADE)
    part = models.ForeignKey(Part, on_delete=models.CASCADE)
    designator = models.CharField(max_length=10)  # 移除primary_key=True
    ordinal = models.IntegerField()
    qty = models.DecimalField(max_digits=11, decimal_places=4)
    
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['bom', 'designator'], name='bomdesignator')
        ]

class Part(models.Model):
    groupid = models.ForeignKey(PartGroup, on_delete=models.CASCADE)
    partno = models.AutoField(primary_key=True)
    partdescription = models.CharField(max_length=100)

解决MySQL自动id字段的默认值问题

  1. 确保数据库配置正确:
    在settings.py中使用官方支持的MySQL引擎,并配置基础参数:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': '你的数据库名',
            'USER': '你的用户名',
            'PASSWORD': '你的密码',
            'HOST': 'localhost',
            'PORT': '3306',
            'OPTIONS': {
                'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            },
        }
    }
    
  2. 重新执行迁移:
    删除之前错误生成的迁移文件(若存在),再运行以下命令:
    python manage.py makemigrations
    python manage.py migrate
    
    Django会自动为BomLine创建自增id主键,MySQL的InnoDB引擎完全支持该类型字段,不会出现默认值问题。

补充说明

这种设计既满足业务需求(同BOM下designator唯一,不同BOM可重复),又符合Django ORM规范,同时完美适配MySQL数据库,不存在场景不适配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:22:52