运行Django shp导入脚本时出现FieldDoesNotExist错误求助
这个错误的根源很明确:你的目标shapefile里存在一个名为False的字段,但你的No_Address模型并没有定义对应的字段,而且你在字段映射字典里也没处理这个字段。加上你开启了strict=True的严格模式,LayerMapping会强制校验shapefile的所有字段都能找到模型中的对应映射,所以就抛出了这个"找不到'False'字段"的错误。
另外还有个容易忽略的问题:你的模型里定义了geom这个空间字段,但映射字典里完全没提它,这样空间数据根本导不进数据库,得一起解决。
下面是具体的修复步骤:
1. 先搞清楚shapefile的字段详情
先用GDAL的ogrinfo命令查看shapefile的所有字段(包括空间字段),这能帮你确认False字段的存在,以及找到空间字段的实际名称(大部分shapefile里叫SHAPE,但也可能是其他名字):
ogrinfo -al building/WestDV_CA_BF_NoAddress_region.shp
2. 修正字段映射字典
根据上面查到的信息,更新你的no_address_mapping:
- 如果你不需要导入那个
False字段,就把它映射为None,告诉LayerMapping直接忽略它 - 加上
geom字段的映射,对应shapefile里的空间字段名
举个例子,如果空间字段是SHAPE,修改后的字典应该是这样:
no_address_mapping = { 'id' : 'ID', 'address' : 'Address', 'city' : 'City', 'zip' : 'ZIP', 'state' : 'State', 'primpgon' : 'PrimPgon', 'numpgons' : 'NumPgons', 'x' : 'X', 'y' : 'Y', 'censusbloc' : 'CensusBloc', 'objectid' : 'ObjectID', 'geom' : 'SHAPE', # 替换成你实际查到的空间字段名 'False' : None, # 忽略shapefile中的这个多余字段 }
3. 可选:关闭严格模式(不推荐)
如果你不想逐个处理多余字段,也可以把lm.save()里的strict=True改成strict=False,这样LayerMapping会自动跳过所有没在映射字典里定义的字段。不过这种方式不够清晰,后续维护容易踩坑,还是建议优先用上面的显式忽略方法。
额外提醒
记得确认shapefile里的字段类型和你模型里的字段类型匹配:比如shapefile里的ID是字符串类型(对应模型的id CharField),PrimPgon是整数类型(对应模型的primpgon BigIntegerField),避免后续出现类型转换错误。
内容的提问来源于stack exchange,提问作者Manikanta

