使用长颈瓶棉花糖序列化几何

时间:2019-10-09 08:24:27

标签: python flask serialization sqlalchemy

我有一个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,因为没有定义为公共字段。

问题是,我该如何修改代码,以使(反)序列化器与“几何模型”字段一起使用?

2 个答案:

答案 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)一样,这正是我想要的。

相关问题