我有一个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')
序列化器看起来像这样:
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')
我尝试在视图中运行它:
allParents = Parent.query.all()
用这个把它变成JSON:
return jsonify({"parents": ParentSerializer(allParents, many=True).data})
当我尝试运行时,我收到错误list indices must be integers, not str
。它来自marshmallow/serializer.py
。当我在那里记录一些东西时,似乎marshmallow正试图访问text
列表的<Comment>
属性。它应该分别访问每个<Comment>
,然后访问text
属性。
我在序列化程序中遗漏了什么?我知道在ParentSerializer中发送many=True
参数告诉marshmallow它应该遍历<Parent>
列表。有没有办法告诉棉花糖它还应该期待很多<Comment>
或<Like>
?
答案 0 :(得分:8)
有没有办法告诉marshmallow它还应该期待很多
<Comment>
或<Like>
?
是。您也可以将many=True
传递给Nested
字段。
class ParentSerializer(Serializer):
comments = fields.Nested(CommentSerializer, many=True)
likes = fields.Nested(LikeSerializer, many=True)
答案 1 :(得分:1)
有没有办法告诉棉花糖它也应该期望许多
<Comment>
或<Like>
?
或者,您可以执行以下操作:
class ParentSerializer(Serializer):
comments = fields.List(fields.Nested(CommentSerializer))
likes = fields.List(fields.Nested(LikeSerializer))
答案 2 :(得分:1)
选中https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html#association-object
您可以使用自定义序列化功能。
class Company(db.Model):
__tablename__ = 'company'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
name = db.Column(db.String(255), nullable=False)
users = relationship("CompanyUser", back_populates="company")
def serialize(self):
main = { c.key: getattr(self, c.key) for c in inspect(self).mapper.column_attrs }
children = [user.serialize() for user in self.users]
main['users'] = children
return main
并且,在其他模型类中,您可以使用这种“通用”可序列化的对象:
def serialize(self):
return { c.key: getattr(self, c.key) for c in inspect(self).mapper.column_attrs }