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=TrueParentSerializer で引数を送信すると、マシュマロに のリストを反復処理する必要があることがわかります<Parent><Comment>マシュマロに多くのまたはを期待する必要があることを伝える方法はあり<Like>ますか?

4

3 に答える 3

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 に答える