2

我有一个用marshmallow序列化的 SLQALchemy 对象。

该对象有 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. 当我在那里记录一些东西时,看起来棉花糖正在尝试访问text. <Comment>它应该单独访问每个<Comment>然后访问该text属性。

我的序列化程序中是否缺少某些内容?我知道many=True在 ParentSerializer 中发送参数会告诉 marshmallow 它应该遍历<Parent>. 有没有办法告诉棉花糖它也应该期待很多<Comment><Like>

4

3 回答 3

8

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

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

class ParentSerializer(Serializer):
    comments = fields.Nested(CommentSerializer, many=True)
    likes = fields.Nested(LikeSerializer, many=True)
于 2014-10-20T03:28:51.603 回答
1

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

或者,您可以这样做:

class ParentSerializer(Serializer):
    comments = fields.List(fields.Nested(CommentSerializer))
    likes = fields.List(fields.Nested(LikeSerializer))
于 2019-12-11T22:52:28.243 回答
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 }
于 2020-07-16T03:23:51.790 回答