【发布时间】:2020-07-30 19:27:21
【问题描述】:
我有两个表,PackMatData 和 ColorData:
class PackMatData(db.Model):
id = db.Column(db.Integer, primary_key=True)
unique_name = db.Column(db.String(20), index=True, unique=True)
se_name = db.Column(db.String(20), index=True)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
labflex_name = db.Column(db.String(20))
country = db.Column(db.String(20), index=True)
color_measurements = db.relationship('ColorData', backref='entry', cascade="all, delete-orphan", lazy='dynamic')
class ColorData(db.Model):
id = db.Column(db.Integer, primary_key=True)
color = db.Column(db.String(20), index=True)
patch = db.Column(db.String(10), index=True)
L = db.Column(db.String(10), index=True)
a = db.Column(db.String(10), index=True)
b = db.Column(db.String(10), index=True)
pack_mat_data_id = db.Column(db.Integer, db.ForeignKey('pack_mat_data.id'))
我想加入这些表,然后序列化返回值。我正在使用 flask-sqlalchemy 左外连接对 PackMatData 表的 id 执行连接:
@app.route('/api/entries')
def entries():
pmcd = db.session.query(PackMatData, ColorData).outerjoin(ColorData, PackMatData.id == ColorData.pack_mat_data_id).all()
data = [{"packmatdata": x[0], "colordata": x[1]} for x in pmcd]
output = NestedSchema(many=True).dump(data)
return jsonify(output)
从联接中,我以元组列表的形式获得了我期望的数据:
[...,(<PackMatData 138>, <ColorData 7272>), (<PackMatData 138>, <ColorData 7285>),(<PackMatData 138>, <ColorData 7286>), (<PackMatData 138>, <ColorData 7287>), (<PackMatData 138>, <ColorData 7284>), (<PackMatData 138>, <ColorData 7283>), (<PackMatData 139>, <ColorData 7321>), (<PackMatData 139>, <ColorData 7322>), (<PackMatData 139>, <ColorData 7323>), (<PackMatData 139>, <ColorData 7320>), (<PackMatData 139>, <ColorData 7319>), (<PackMatData 139>, <ColorData 7311>), ...]
我在 stackoverflow flask-marshmallow two db objects in one schema 中读到,marshmallow 需要一个字典列表,这就是为什么我在将它传递给转储之前进行转换。
这是我为序列化定义的模式:
class ColorDataSchema(ma.ModelSchema):
class Meta:
model = ColorData
class PackMatDataSchema(ma.ModelSchema):
class Meta:
model = PackMatData
class NestedSchema(ma.ModelSchema):
colordata = ma.Nested(ColorDataSchema)
packmatdata = ma.Nested(PackMatDataSchema, many=True)
问题是转储函数总是返回以下内容:
[...,{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {},...]
我也尝试过这个模式(结果相同):
class PackMatDataSchema(ma.ModelSchema):
class Meta:
model = PackMatData
class ColorDataSchema(ma.ModelSchema):
packmatdata = ma.Nested(PackMatDataSchema, many=True)
class Meta:
model = ColorData
你能引导我走向正确的方向吗?很抱歉,这篇文章很长,但我想尽可能多地为您提供详细信息。
【问题讨论】:
-
您找到解决方案了吗?我已经为同样的问题浪费了很多时间:(
-
不,很遗憾我从未找到解决方案。我最终彻底改造了它
-
与此同时,我发现如果您避免使用元组(连接表的结果),它会起作用,请在此处查看我的答案:stackoverflow.com/questions/67213618/… 我仍然不确定,如果它是最好的解决方案,因为它似乎不是很快(只是我的印象)。你是怎么解决的?
标签: python flask-sqlalchemy json-deserialization outer-join flask-marshmallow