无法将 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 格式。