无法将 geodjango 模型数据序列化为 json 以传回网站
Cannot serialize geodjango model data to json for passing back to website
我有一些模型在他们的关系中非常直接:
class CesiumEntity(models.Model):
be_number = models.CharField(max_length=100) #the number assigned to a foot print to distinguish
zone_id = models.ForeignKey('ZoneEntity', null=True, blank=True)
sensor = models.CharFIeld(max_length=100) # sensor this entity is from
....
和
class ZoneEntity(models.Model):
zone_number = models.CharField(max_length=100, primary_key=True)
#zone_number = models.CharField(max_length=100)
mpoly = models.PolygonField() #this should grow and shrink for the most representative one...
objects = models.GeoManager()
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
我正在尝试从他们那里获取数据作为连接:
object_list = ZoneEntity.objects.filter(cesiumentity__sensor__in=sensor).distinct('zone_number')
这应该等同于 SQL:
SELECT distinct(zone_number) FROM SWSITE_ZONEENTITY INNER JOIN SWSITE_CESIUMENTITY ON SWSITE_ZONEENTITY.zone_number = SWSITE_CESIUMENTITY.zone_id_id WHERE SWSITE_CESIUMENTITY.sensor = 'RADARSAT-2'
因此,这会根据在 UI 上选择的传感器为我提供所有这些区域编号。这很好,每个 zonenumber
都有很多其他的东西 (CesiumEntities
)。所以我想将所有这些汇总为一个 json 对象以发送回我的网络界面。
像这样
zoneEntity.ZoneNumber # fromDB
zoneEntity.mpoly (Geometry) # fromDB
zoneEntity.cesiumEntities # list of all the cesiumentities with the
# zonenumber and with the sensor selected.
理想情况下,如果我可以为自动包含数据的序列化工作:
jdata =serialize('geojson', object_list,
geometry_field = 'mpoly');
但这在许多方面都失败了...大多数属性和列表不存在或格式不正确。
所以我正在尝试构建自己的对象以发回:(虽然我确信这是困难的方法):
returnData = []
secondData =[]
object_list = ZoneEntity.objects.filter(cesiumentity__sensor__in=sensor).distinct('zone_number')
print len(object_list)
for ze in object_list:
second_list = CesiumEntity.objects.filter(zone_id = ze.zone_number)
returnData.append(ze.zone_number)
returnData.append(ze.mpoly)
for sl in second_list:
secondData.append(sl.sensor)
secondData.append(sl.resource_location)
secondData.append(sl.name)
secondData.append(sl.country_code)
secondData.append(sl.corner_coords)
secondData.append(sl.target_name)
secondData.append(sl.collection_date)
returnData.append(secondData)
(不完全确定以上是获取格式的正确方法,以便为 json 序列化做好准备)
所以我想将 returnData 序列化为 json,这样我就可以让所有区域在地图上显示它们,然后在单击一个区域时显示该区域中的所有铯实体。到目前为止,当我尝试调用 json.dumps 时出现错误:
return HttpResponse(json.dumps({'data': returnData})) #was jdata
结果:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Polygon object at 0x10cb1a880> is not JSON serializable
我确实看到了这个:
http://www.django-rest-framework.org/tutorial/1-serialization/
我不知道这是否是我必须做的,或者问题是否简单得多,我只是误会了什么
我认为这可能是 mpoly 的问题,所以我查找了一些项目(在 mapping
上发现了一些形状匀称的东西)试过了但没有找到(甚至对此也有一个 SO 问题:shapely mapping gives error on my geometry when serializing)
您可以使用 rest_framework's serializers:
在名为 serializers.py
的文件中为模型创建自己的序列化程序
class ZoneEntitySerializer(serializers.ModelSerializer):
class Meta:
model = ZoneEntity
fields = ("the", "fields", "that", "you want", "serialized",)
之后,鉴于你正在做join,保持
object_list = ZoneEntity.objects.filter(cesiumentity__sensor__in=sensor).distinct('zone_number')
假设这对你的情况是正确的。
最终创建响应:
res = ZoneEntitySerializer(object_list, many=True)
(many=True 让你的序列化程序知道它将序列化多个对象)
和return HttpResponse(res.data)
现在响应必须采用 JSON 格式。
我有一些模型在他们的关系中非常直接:
class CesiumEntity(models.Model):
be_number = models.CharField(max_length=100) #the number assigned to a foot print to distinguish
zone_id = models.ForeignKey('ZoneEntity', null=True, blank=True)
sensor = models.CharFIeld(max_length=100) # sensor this entity is from
....
和
class ZoneEntity(models.Model):
zone_number = models.CharField(max_length=100, primary_key=True)
#zone_number = models.CharField(max_length=100)
mpoly = models.PolygonField() #this should grow and shrink for the most representative one...
objects = models.GeoManager()
created_at=models.DateField(auto_now_add=True)
updated_at=models.DateField(auto_now=True)
我正在尝试从他们那里获取数据作为连接:
object_list = ZoneEntity.objects.filter(cesiumentity__sensor__in=sensor).distinct('zone_number')
这应该等同于 SQL:
SELECT distinct(zone_number) FROM SWSITE_ZONEENTITY INNER JOIN SWSITE_CESIUMENTITY ON SWSITE_ZONEENTITY.zone_number = SWSITE_CESIUMENTITY.zone_id_id WHERE SWSITE_CESIUMENTITY.sensor = 'RADARSAT-2'
因此,这会根据在 UI 上选择的传感器为我提供所有这些区域编号。这很好,每个 zonenumber
都有很多其他的东西 (CesiumEntities
)。所以我想将所有这些汇总为一个 json 对象以发送回我的网络界面。
像这样
zoneEntity.ZoneNumber # fromDB
zoneEntity.mpoly (Geometry) # fromDB
zoneEntity.cesiumEntities # list of all the cesiumentities with the
# zonenumber and with the sensor selected.
理想情况下,如果我可以为自动包含数据的序列化工作:
jdata =serialize('geojson', object_list,
geometry_field = 'mpoly');
但这在许多方面都失败了...大多数属性和列表不存在或格式不正确。
所以我正在尝试构建自己的对象以发回:(虽然我确信这是困难的方法):
returnData = []
secondData =[]
object_list = ZoneEntity.objects.filter(cesiumentity__sensor__in=sensor).distinct('zone_number')
print len(object_list)
for ze in object_list:
second_list = CesiumEntity.objects.filter(zone_id = ze.zone_number)
returnData.append(ze.zone_number)
returnData.append(ze.mpoly)
for sl in second_list:
secondData.append(sl.sensor)
secondData.append(sl.resource_location)
secondData.append(sl.name)
secondData.append(sl.country_code)
secondData.append(sl.corner_coords)
secondData.append(sl.target_name)
secondData.append(sl.collection_date)
returnData.append(secondData)
(不完全确定以上是获取格式的正确方法,以便为 json 序列化做好准备) 所以我想将 returnData 序列化为 json,这样我就可以让所有区域在地图上显示它们,然后在单击一个区域时显示该区域中的所有铯实体。到目前为止,当我尝试调用 json.dumps 时出现错误:
return HttpResponse(json.dumps({'data': returnData})) #was jdata
结果:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Polygon object at 0x10cb1a880> is not JSON serializable
我确实看到了这个: http://www.django-rest-framework.org/tutorial/1-serialization/
我不知道这是否是我必须做的,或者问题是否简单得多,我只是误会了什么
我认为这可能是 mpoly 的问题,所以我查找了一些项目(在 mapping
上发现了一些形状匀称的东西)试过了但没有找到(甚至对此也有一个 SO 问题:shapely mapping gives error on my geometry when serializing)
您可以使用 rest_framework's serializers:
在名为serializers.py
的文件中为模型创建自己的序列化程序
class ZoneEntitySerializer(serializers.ModelSerializer):
class Meta:
model = ZoneEntity
fields = ("the", "fields", "that", "you want", "serialized",)
之后,鉴于你正在做join,保持
object_list = ZoneEntity.objects.filter(cesiumentity__sensor__in=sensor).distinct('zone_number')
假设这对你的情况是正确的。
最终创建响应:
res = ZoneEntitySerializer(object_list, many=True)
(many=True 让你的序列化程序知道它将序列化多个对象)
和return HttpResponse(res.data)
现在响应必须采用 JSON 格式。