【问题标题】:Flask SQLAlchemy select child object - return JSONB columnFlask SQLAlchemy 选择子对象 - 返回 JSONB 列
【发布时间】:2016-04-26 23:30:15
【问题描述】:

我有一个具有一对多关系的类。我想归还关系中所有父母的孩子;具体来说,我想返回子表中的所有 JSONB 对象。

这些是我的班级:

class Parent(db.Model):
    __tablename__ = ‘parent220416'
    id = db.Column(db.Integer, primary_key=True)
    children = db.relationship(‘Child’, backref=‘Parent’, lazy='dynamic')

class Child(db.Model):
    __tablename__ = ‘child220416'
    id = db.Column(db.Integer, primary_key=True)
    parentid = db.Column(db.Integer, db.ForeignKey('words220416.id'))
    data = db.Column(JSONB)

然后使用 Flask Restful,我尝试像这样选择所有孩子:

class ParentChild(Resource):
    def get(self, id):
           result = db.session.query(Parent).get(id)
           result_child = result.children
           return {'child': result_child}

有一个错误:

raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x106178da0> is not JSON serializable

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-restful


    【解决方案1】:

    如果您想获取父级的每个子级的所有 data 对象。您可以执行以下查询:

    result_child = db.session.query(Child.data).filter(Child.parentid == id).all()

    如果您想使用children 关系,可以对其进行迭代:

    result_child = [child.data for child in result.children]
    

    【讨论】:

    • 它有效,但如果我理解我并没有真正利用在我的 2 个类中声明的关系...是否有利用这种关系的最佳实践?
    • 两个选项中的第二个使用关系。但我明白你的意思;这种关系的利用似乎很肤浅。我还没有找到任何方法来更深入地使用关系来达到你想要的目的,并且迭代关系是很常见的(虽然我不是特别喜欢它,这就是我给出第一个选项的原因)。如果您不喜欢对关系进行迭代,可以尝试使用 marshmallow 之类的方式对子级进行序列化。
    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多