【问题标题】:how to query data inside nested data in flask_sqlalchemy如何在flask_sqlalchemy中查询嵌套数据中的数据
【发布时间】:2019-08-26 11:49:57
【问题描述】:

我在这里使用 flask_marshmallow 来显示我对前端的 json 响应,

我有如下表

class PostImgList(db.Model):
    __tablename__ = 'boat_img_list'
    id = db.Column(db.Integer, primary_key=True)
    link = db.Column(db.Text, nullable=False)
    main = db.Column(db.Boolean, default=False)
    boat_id = db.Column(db.Integer, db.ForeignKey("boat.id"))

class Post(db.Model):
    __tablename__ = 'boat'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(200))
    seat_capacity = db.Column(db.Integer)
    img_list = db.relationship(PostImgList, backref='boat', lazy=True)

我可以通过以下方式获取全部数据:

class PostImgListSchema(ma.ModelSchema):
    class Meta:
        model = PostImgList

class PostSchemaClass(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'seat_capacity', 'img_list')
    img_list = ma.Nested(PostImgListSchema, many=True, only='link')


schema = PostSchemaClass(many=True)

data = Post.query.all()
data = schema.dump(data).data
return data

前端可以得到如下数据

"data": [
    {
      "seat_capacity": 1,
      "id": 1,
      "name": "mantapt",
      "img_list": [
        "fffadweda",
        "fffadweda",
        "fffadweda",
        "fffadweda",
        "fffadweda"
      ]
    },
    {
      "seat_capacity": 10,
      "id": 2,
      "name": "keren",
      "img_list": [
        "fffadweda"
      ]
    }
  ]

我知道它在PostImgListSchema 中设置了many=True,我只想在一个结果中使用带有查询过滤器的嵌套模式的一些数据,所以我必须为PostImgListSchema 设置many=False? 那么,PostImgListSchema schema 怎么写?

我只是想用过滤器main field value 显示我的PostImgList 的位置是True,就像下面这样:

"data": [
    {
      "seat_capacity": 1,
      "id": 1,
      "name": "mantapt",
      "img_list": "fffadweda"
    },
    {
      "seat_capacity": 10,
      "id": 2,
      "name": "keren",
      "img_list": "fffadweda"
    }
  ]

谢谢:)

【问题讨论】:

    标签: flask flask-sqlalchemy marshmallow


    【解决方案1】:

    结合使用 primaryjoin 或 secondaryjoin(指定您的连接条件)与 uselist=False 应该可以解决问题(有关详细信息,请参阅here)。

    【讨论】:

    • 如果我这样做,我将无法过滤我的PostImgList
    • 你为什么不能?您可以将其包含在连接条件中。
    【解决方案2】:

    解决了!!!

    我只是在类模型Post中创建一个属性

    class Post(db.Model):
    ...
    ...
        @property
        def image(self):
            img = PostImgList.query.filter_by(main=True).first()
            if not img:
                return ""
            return img.link
    

    【讨论】:

    • 请注意,每次访问时都会重新计算此属性,并且它是只读的。
    • 谢谢@MikhailBerlinkov,现在我才意识到
    猜你喜欢
    • 2021-10-02
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2021-07-26
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多