django外键字段会自动在数据库字段后面加上_id

发布时间:2026/7/21 22:56:38
django外键字段会自动在数据库字段后面加上_id 这个错误(1054, Unknown column wms_inventory_check_task.plan_id in where clause)表示Django 查询wms_inventory_check_task表时SQL 使用了plan_id字段但是你的 MySQL 表中不存在plan_id这个列。1. 产生原因你的 Django Modelplanmodels.ForeignKey(InventoryCheckPlan,on_deletemodels.CASCADE,related_nametasks,)Django 会默认生成数据库字段plan_idBIGINT所以 ORM 查询InventoryCheckTask.objects.filter(plan_id1)实际 SQLSELECT*FROMwms_inventory_check_taskWHEREplan_id1;但是你的数据库表SHOWCOLUMNSFROMwms_inventory_check_task;可能没有plan_id2. 检查数据库表执行DESCwms_inventory_check_task;正常应该看到-------------------------- | Field | Type | -------------------------- | id | bigint | | plan_id | bigint | | location_id | int | | assignee_id | bigint | | status | smallint | --------------------------如果没有plan_id就是数据库和 Model 不一致。3. 解决方式一推荐执行 migration查看 migrationpython manage.py makemigrations然后python manage.py migrateDjango 会创建ALTERTABLEwms_inventory_check_taskADDCOLUMNplan_idBIGINTNOTNULL;4. 解决方式二数据库已经手动创建如果你之前是手写 SQL 创建表例如CREATETABLEwms_inventory_check_task(idBIGINT,planBIGINT);错误。应该是plan_idBIGINTNOTNULL因为 Django ForeignKeyplanmodels.ForeignKey(...)数据库字段不是plan而是plan_id5. 如果字段实际叫 plan比如你的表CREATETABLEwms_inventory_check_task(idBIGINT,planBIGINT)可以告诉 Djangoplanmodels.ForeignKey(InventoryCheckPlan,db_columnplan,on_deletemodels.CASCADE)这样 Django 查询WHEREplan1而不是WHEREplan_id1但是一般不推荐因为 Django 规范就是xxx_id6. 如果 migration 状态混乱查看python manage.py showmigrations例如[X] 0001_initial [X] 0002_add_task显示已经执行但是数据库没有字段。说明migration 记录存在但是数据库结构不一致。可以开发环境python manage.py migrate app_name zero python manage.py migrate生产环境不要回滚手动补字段ALTERTABLEwms_inventory_check_taskADDCOLUMNplan_idBIGINTNOTNULL;然后补外键ALTERTABLEwms_inventory_check_taskADDCONSTRAINTfk_task_planFOREIGNKEY(plan_id)REFERENCESwms_inventory_check_plan(id);结合你前面的 Model你的表应该至少包含id plan_id location_id assignee_idstatus现在错误说明plan_id 缺失所以第一步直接执行DESCwms_inventory_check_task;看一下字段。大概率是你之前手动建表时把plan_id写成了plan或者漏掉了。