Django导入Shapefile报错:BuildingAddress不存在'False'字段
FieldDoesNotExist: BuildingAddress has no field named 'False'错误 这个错误看起来有点诡异,但根源大概率是你的LayerMapping配置或参数传递出了问题,导致程序误以为你要映射一个名为False的模型字段。下面是一步步的排查和解决方案:
1. 检查映射字典的隐性错误
错误信息明确指出程序在查找BuildingAddress模型的False字段,这说明你的no_address_mapping字典中很可能存在一个键为'False'的条目——可能是拼写错误、语法错误(比如把冒号写成等号)或者不小心添加的无效内容。
仔细核对你的映射字典定义:
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', }
确保所有键都是BuildingAddress模型中存在的字段名,没有拼写错误,也没有意外混入的'False'键。
2. 显式指定几何字段的映射
你的模型中有geom字段(MultiPolygonField),但当前映射字典里没有包含它。虽然LayerMapping默认会处理名为geom的几何字段,但显式添加映射可以避免潜在的自动匹配错误:
no_address_mapping = { # ... 保留原有字段映射 ... 'geom' : 'geom', # 第二个'geom'是Shapefile中的几何字段名,根据你的实际情况调整 }
同时,创建LayerMapping实例时,显式指定geom_field参数,确保程序正确识别几何字段:
lm = LayerMapping( BuildingAddress, no_address_shp, no_address_mapping, encoding='iso-8859-1', transform=False, geom_field='geom' # 明确指定模型中的几何字段名 )
3. 确认参数传递的正确性
LayerMapping的参数顺序很关键,建议你把所有非必填参数都用关键字参数明确指定,避免位置参数的歧义。比如你之前的写法虽然用了关键字参数,但把transform=False和encoding的位置调整后,可读性和正确性会更高。
4. 检查Shapefile的字段情况
用QGIS或其他GIS工具打开你的Shapefile,检查属性表:
- 确保所有你在映射字典中指定的字段(比如
ID、Address等)都存在 - 确认没有名为
False的异常字段(虽然这种情况很少见,但如果存在,strict=True会触发检查错误)
5. 临时关闭strict模式排查
如果上面的步骤都没解决问题,可以临时把lm.save(strict=True)改成strict=False,看看是否能成功导入。这只是临时排查手段,导入完成后建议改回strict=True,确保数据匹配的正确性。
按照这些步骤排查,应该能解决这个奇怪的False字段错误。
内容的提问来源于stack exchange,提问作者Manikanta

