我有一个sqlalchemy2模型(具有地球化学扩展名),其中包含如下所示的几何数据类型:
class Estate(db.Model):
id = db.Column(db.Integer, primary_key=True)
geom = db.Column(Geometry(geometry_type='POLYGON')
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
user = db.relationship('Users', backref='estates')
和棉花糖模式:
class EstateSchema(ma.ModelSchema):
class Meta:
model = Estates
但是在尝试序列化期间,我收到以下错误:
marshmallow_sqlalchemy.exceptions.ModelConversionError: Could not find field column of type <class 'geoalchemy2.types.Geometry'>.
ModelConversion
抱怨WKBElement
,因为没有定义为公共字段。
问题是,我该如何修改代码,以使(反)序列化器与“几何模型”字段一起使用?
答案 0 :(得分:0)
marshmallow_sqlalchemy
不知道如何序列化类型geom
的字段Geometry
。这是因为GeoAlchemy
中不直接支持marshmallow
。为了解决这个问题,您需要编写一个自定义ModelConverter
,它告诉marshmallow
如何序列化Geometry
类型的字段。
from geoalchemy2.types import Geometry as GeometryType
from marshmallow_sqlchemy.convert import ModelConverter as BaseModelConverter
class ModelConverter(BaseModelConverter):
SQLA_TYPE_MAPPING = {
**BaseModelConverter.SQLA_TYPE_MAPPING,
**{GeometryType: fields.Field()},
}
class EstateSchema(ma.ModelSchema):
class Meta:
model = Estates
model_converter = ModelConverter
marshmallow-sqlalchemy的github存储库中提到了相同的内容
答案 1 :(得分:0)
我知道这已经很老了,但是现在回答,因为我在解决这个问题后才为自己解决了这个问题。我完成此操作的方式仅是将一个方法字段添加到我的模式中,如下所示:
from marshmallow_sqlalchemy import SQLAlchemySchema, fields
from geoalchemy2.shape import to_shape
from common.models import Node
class NodeSchema(SQLAlchemySchema):
class Meta:
model = Node
geom = fields.fields.Method("geomToPoint")
def geomToPoint(self, obj):
return to_shape(obj.geom)
这会将Geometry
字段作为Shapely形状字段返回,就像POINT (39.2934324 -123.59348)
一样,这正是我想要的。