序列化具有多个子项的子项的SQLAlchemy对象

Tay*_*ler 2 python sqlalchemy flask flask-sqlalchemy marshmallow

我有一个SLQALchemy对象,我正在使用marshmallow序列化.

该对象有N个赞和N个评论.它看起来像这样:

class Parent():

    __tablename__ = 'parent'

    title = Column(db.String(100), unique=True, nullable=False)
    description = Column(db.String(500))
    created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow)
    comments = relationship('Comment')
    likes = relationship('Like')
Run Code Online (Sandbox Code Playgroud)

序列化器看起来像这样:

class CommentSerializer(Serializer):
    class Meta:
        fields = ('id', 'text', 'created_at', 'parent_id')

class LikeSerializer(Serializer):
    class Meta:
        fields = ('id', 'created_at', 'parent_id')

class ParentSerializer(Serializer):
    comments = fields.Nested(CommentSerializer)
    likes = fields.Nested(LikeSerializer)

    class Meta:
        fields = ('id', 'title', 'description', 'comments', 'likes')
Run Code Online (Sandbox Code Playgroud)

我尝试在视图中运行它,如下所示:

allParents = Parent.query.all()
Run Code Online (Sandbox Code Playgroud)

并将其转换为JSON:

return jsonify({"parents": ParentSerializer(allParents, many=True).data})
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我收到一个错误list indices must be integers, not str.它来自marshmallow/serializer.py.当我在那里记录一些东西时,似乎棉花糖正试图访问text列表的属性<Comment>.它应该是单独访问每个,<Comment>然后访问该text属性.

我在序列化器中遗漏了什么吗?我知道many=True在ParentSerializer中发送参数告诉marshmallow它应该迭代一个列表<Parent>.有没有办法告诉棉花糖它还应该期待很多<Comment><Like>

Ste*_*e L 8

有没有办法告诉棉花糖它还应该期待很多<Comment><Like>

是.您也可以传递many=TrueNested字段.

class ParentSerializer(Serializer):
    comments = fields.Nested(CommentSerializer, many=True)
    likes = fields.Nested(LikeSerializer, many=True)
Run Code Online (Sandbox Code Playgroud)