首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用flask-marshmallow序列化几何图形

使用flask-marshmallow序列化几何图形
EN

Stack Overflow用户
提问于 2019-10-09 16:24:28
回答 2查看 575关注 0票数 2

我有一个包含如下几何数据类型的sqlalchemy2 (带geoalchemy扩展)模型:

代码语言:javascript
复制
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模式:

代码语言:javascript
复制
class EstateSchema(ma.ModelSchema):
    class Meta:
        model = Estates

但是在尝试序列化的过程中,我收到了以下错误:

代码语言:javascript
复制
marshmallow_sqlalchemy.exceptions.ModelConversionError: Could not find field column of type <class 'geoalchemy2.types.Geometry'>.

抱怨WKBElementModelConversion,因为没有定义为公共字段。

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

EN

回答 2

Stack Overflow用户

发布于 2020-07-20 04:28:28

我知道这是相当古老的,但现在回答,因为我刚在这个问题上解决了这个问题。我实现它的方法就是在我的模式中添加一个方法字段,如下所示:

代码语言:javascript
复制
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)一样。

票数 2
EN

Stack Overflow用户

发布于 2019-10-09 20:27:05

marshmallow_sqlalchemy不知道如何序列化Geometry类型的字段geom。这是因为marshmallow不直接支持GeoAlchemy。为了解决这个问题,您需要编写一个自定义的ModelConverter,它告诉marshmallow如何序列化Geometry类型的字段。

代码语言:javascript
复制
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存储库中也提到了这一点

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58299923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档