【问题标题】:Serialize geometry using flask-marshmallow使用烧瓶棉花糖序列化几何图形
【发布时间】:2020-07-20 04:38:13
【问题描述】:

我有一个包含几何数据类型的 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')

和棉花糖模式:

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

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

【问题讨论】:

    标签: python flask serialization sqlalchemy


    【解决方案1】:

    我知道这已经很老了,但现在回答,因为我在登陆这个问题后刚刚自己解决了这个问题。我完成它的方式就是向我的架构添加一个方法字段,如下所示:

    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) 这正是我所寻找的。​​p>

    【讨论】:

      【解决方案2】:

      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仓库里也有提到过

      【讨论】:

        猜你喜欢
        • 2019-03-04
        • 1970-01-01
        • 2017-02-02
        • 2020-09-23
        • 1970-01-01
        • 2020-10-31
        • 2021-12-14
        • 2020-01-29
        • 1970-01-01
        相关资源
        最近更新 更多