Django-Sqlite模型字段名与生成的数据库列名不一致问题问询
Django 自动生成
enclosure_name_id列的原因 Django ORM 针对ForeignKey、OneToOneField这类关联字段,默认会在数据库层自动添加_id后缀作为实际存储外键值的列名,你在模型中定义的字段名为enclosure_name,所以底层生成的存储列就会自动命名为enclosure_name_id,这是Django的内置规则,和你是否删除迁移、数据库文件无关,也不属于代码错误。
排查及解决方法
- 先确认字段类型:如果你的
enclosure_name本身就是关联其他表的外键字段,enclosure_name_id属于正常生成的列名,日常开发用ORM查询时,你既可以用enclosure_name调用关联对象,也可以用enclosure_name_id直接获取外键存储的值,不需要额外调整。 - 如果你需要数据库列名和模型字段名完全一致,直接在字段定义中添加
db_column参数指定列名即可,示例:
# 假设该字段是关联Enclosure模型的外键,添加db_column参数指定存储列名 enclosure_name = models.ForeignKey( Enclosure, on_delete=models.CASCADE, db_column="enclosure_name" )
- 配置修改完成后按以下步骤重新生成迁移和数据库:
- 删除所有App下
migrations目录中除__init__.py之外的全部文件 - 删除根目录下的Sqlite数据库文件
- 依次执行
python manage.py makemigrations、python manage.py migrate
- 删除所有App下
- 验证配置是否生效:执行
makemigrations后打开新生成的迁移文件,查看enclosure_name字段的配置项,确认db_column参数已正确写入,再执行迁移操作即可。
内容的提问来源于stack exchange,提问作者Gero
相关产品推荐
相关产品推荐

