Django序列化地理数据时Polygon对象无_meta属性报错如何解决
问题解决方法
报错根因
Django 内置的serialize序列化方法要求传入的序列化对象必须是Django ORM模型实例或查询集,你当前代码中传入的是Commune实例的geom属性,这是一个Polygon几何对象,没有模型特有的_meta属性,因此触发属性不存在报错。
修复代码
修改views.py中的validate_commune视图逻辑如下:
def validate_commune(request): commune_id = request.GET.get('id_commune', None) # 获取完整的Commune模型实例 commune_obj = Commune.objects.get(id=int(commune_id)) # 序列化对象传入模型实例,不要单独提取geom字段 geojson_res = serialize( 'geojson', [commune_obj], geometry_field='geom', fields=('name',) ) # 注意JsonResponse要求传入字典格式,不要直接放序列化结果构成集合 return JsonResponse({"geojson": geojson_res})
补充说明
- 如果不需要外层包裹JSON键,直接返回标准GeoJSON格式,可以替换返回语句为:
from django.http import HttpResponse return HttpResponse(geojson_res, content_type='application/geo+json') - 生产环境建议补充参数合法性校验,避免
id_commune为空、非数字、对应实例不存在的场景抛出异常。
内容的提问来源于stack exchange,提问作者Saliha Alger
相关产品推荐
相关产品推荐

