访问模型的列时,“ column_property”定义的SQLAlchemy列未显示

时间:2019-05-21 00:21:28

标签: python flask sqlalchemy

我希望我的sqlalchemy模型中的列total等于amount * price。列值可以通过object.total访问,但列名不会显示在model.__table__.columns.keys()

我尝试将total设置为hybrid_property和column_property。当我访问列时,这两种方法都无法包含该列。

这是我的模特

class RawMaterials(db.Model):
    __tablename__ = 'raw_materials'
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.String(64))
    product = db.Column(db.String(64))
    amount = db.Column(db.Integer)
    price = db.Column(db.Integer)
    total = column_property(amount * price)

    def __repr__(self):
        return '<id:{} product:{}>'.format(self.id, self.product)

这是我在模型中查询列的地方:

@app.route('/tables')
@login_required
def tables(methods=["GET", "POST"]):
    if request.args.get('data'):
        table = request.args.get('data').lower().replace(" ","_")
    else:
        table = 'raw_materials'
    database = get_db_model(table)
    materials = database.query.all()
    columns = database.__table__.columns.keys()
    new_mats = format_data(materials, columns)
    title = table.replace("_", " ").upper()
    return render_template('tables.html.j2', title=title, materials=materials, columns=columns)

如果我将columns变量打印到控制台中,它将返回: ['id', 'type', 'product', 'amount', 'price'] 我希望它返回: ['id', 'type', 'product', 'amount', 'price', 'total']

我希望总数在列中,但不是。

1 个答案:

答案 0 :(得分:0)

使用column_property()函数时,需要确保  该表达式与SELECT类发出的RawMaterials语句兼容。您可以尝试使用Hybrid

from sqlalchemy.ext.hybrid import hybrid_property

class RawMaterials(db.Model):
    __tablename__ = 'raw_materials'
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.String(64))
    product = db.Column(db.String(64))
    amount = db.Column(db.Integer)
    price = db.Column(db.Integer)

    def __repr__(self):
        return '<id:{} product:{}>'.format(self.id, self.product)

    @hybrid_property
    def total(self):
        return self.amount * self.price

此处的total属性返回amountprice属性的乘法。对于RawMaterials的实例,这种乘法在Python中使用标准Python描述符进行。