我希望我的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']
我希望总数在列中,但不是。
答案 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
属性返回amount
和price
属性的乘法。对于RawMaterials
的实例,这种乘法在Python中使用标准Python描述符进行。