我在我的模型中有一堆GIS表格,我在flaskSQLAlchemy中创建。这些模型中的每一个都具有“geom”字段,该字段是WKB对象。 需要将JSON序列化为WKT或geojson,以便API GET调用可以正常工作。
我尝试使用geoalchemy2功能,但我卡住了。 我使用了一瓶棉花糖/棉花糖 - sqlalchemy组合,我尝试了类似下面的东西,没有运气。
from geoalchemy2 import functions
from marshmallow import fields
class WKTSerializationField(fields.Field):
def _serialize(self, value, attr, obj):
if value is None:
return value
else:
if type(value).__name__ == 'WKBElement':
return functions.ST_AsEWKT(value)
else:
return None
class GISModelTableSchema(ma.ModelSchema):
class Meta:
model = GISModelTable
geom = WKTSerializationField(attribute="geom")
如果可以,请提供代码示例,如何序列化/反序列化marshmallow炼金术中的字段。或者欢迎任何答案。
答案 0 :(得分:0)
尝试使用marshmallow-sqlalchemy 'fields.Method()',并在该方法中使用geoalchemy2.shape包中的另一种方法'to_shape '。这将帮助您解决序列化问题。
#!schemas.py
from marshmallow import fields
from marshmallow_sqlalchemy import ModelSchema
from geoalchemy2.shape import to_shape
from .models import YourModel
class YourModelSchema(ModelSchema):
your_geom_field = fields.Method("geom_to_dict")
@staticmethod
def geom_to_dict(obj):
point = to_shape(obj.your_geom_field)
return {
lat: point.y,
lon: point.x
}
class Meta:
model = YourModel
exclude = ("your_geom_field")
此功能可帮助您进行序列化,有关反序列化的信息,请参阅geoalchemy2 api参考
尝试自己编写所有必填字段,您可能会以所需的形式获得更具体的序列化