与棉花糖嵌套Flask-SQLAlchemy关系

时间:2019-09-07 04:23:59

标签: python flask-sqlalchemy marshmallow

我正在使用flask_marshmallow(0.10.1)将来自flask_sqlalchemy表的数据序列化为JSON对象。

但是,两个表(“帖子”和“评论”)之间存在关系。我已经做过一些研究,但是不确定如何使用嵌套或调用什么来正确序列化为JSON。

这是我的flask_sqlalchemy类:

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text, nullable=False)
    comments = db.relationship('Comment',backref='post_owner') #This needs an integer to increment im

    def __repr__(self):
        return f"Post({self.id}, {self.content}), {self.comments}"

class Comment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    comment = db.Column(db.Text, nullable=True)
    owner_id = db.Column(db.Integer, db.ForeignKey('post.id'))

    def __repr__(self):
        return f"Comment {self.comment}"

这是我的flask_marshmallow模式:

class PostSchema(ma.ModelSchema):
    class Meta:
        model = Post

class CommentSchema(ma.ModelSchema):
    class Meta:
        model = Comment

最后是我在调用架构进行序列化的函数:

def convert_to_json(post_to_convert):  
    post_schema = PostSchema()
    output = post_schema.dump(post_to_convert)
    return output

我得到的当前输出是这样:

{id: 1, content: "Hello Again", comments: Array(3)} comments: (3) [1, 2, 3] 

我想得到的(在注释中:)是这样的:

{id: 1, content: "Hello Again", comments: Array(3)} comments: (3) ["first comment", "second comment", "third comment"] 

我需要实际的注释文本数据,而不仅仅是我正在获取的ID号。感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以在Nested中的PostSchema字段中轻松实现这一目标(假设您正在使用marshmallow-sqlalchemy):

from marshmallow_sqlalchemy.fields import Nested

class PostSchema(ma.ModelSchema):
    class Meta:
        model = Post
    comments = Nested(CommentSchema, many=True)

class CommentSchema(ma.ModelSchema):
    class Meta:
        model = Comment

我建议您阅读Marshmallow's documentation about Nesting schemas,以了解不同的选项和参数。 另外,Marshmallow SQLAlchemy的文档,特别是“食谱”部分很有帮助,并提供了有关如何构建模式的想法。