我有一个包含如下几何数据类型的sqlalchemy2 (带geoalchemy扩展)模型:
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')和marshmallow模式:
class EstateSchema(ma.ModelSchema):
class Meta:
model = Estates但是在尝试序列化的过程中,我收到了以下错误:
marshmallow_sqlalchemy.exceptions.ModelConversionError: Could not find field column of type <class 'geoalchemy2.types.Geometry'>.抱怨WKBElement的ModelConversion,因为没有定义为公共字段。
问题是,我如何修改代码,使(反)序列化程序与几何模型字段一起工作?
发布于 2020-07-20 04:28:28
我知道这是相当古老的,但现在回答,因为我刚在这个问题上解决了这个问题。我实现它的方法就是在我的模式中添加一个方法字段,如下所示:
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字段作为形状良好的字段返回,就像我要查找的POINT (39.2934324 -123.59348)一样。
发布于 2019-10-09 20:27:05
marshmallow_sqlalchemy不知道如何序列化Geometry类型的字段geom。这是因为marshmallow不直接支持GeoAlchemy。为了解决这个问题,您需要编写一个自定义的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存储库中也提到了这一点
https://stackoverflow.com/questions/58299923
复制相似问题