Столбец SQLAlchemy, определенный параметром column_property, не отображается при доступе к столбцам модели. - PullRequest
1 голос
/ 21 мая 2019

Мне нужен столбец total в моей модели sqlalchemy, равный amount * price.Доступ к значению столбца можно получить по object.total, но имя столбца не отображается в model.__table__.columns.keys()

. Я попытался установить итоговые значения как 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 голосов
/ 21 мая 2019

При использовании функции 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...