【问题标题】:Access column value from relationship property从关系属性访问列值
【发布时间】:2018-11-11 11:35:31
【问题描述】:

假设以下示例,我们有两个models,每个都引用它们各自的sqlite 表:

class supplier_invoices(db.Model):
  id = db.Column('id', db.Integer, primary_key = True)
  at_date =  db.Column(db.String(100))    
  at_shortnumber =  db.Column(db.String(100))    

  def __repr__(self):
      return str(self.at_date)

class product_inventory(db.Model):
  id = db.Column('id', db.Integer, primary_key = True)
  pi_shortnumber =  db.Column(db.String(100))
  pi_lot_name =  db.Column(db.String(100))
  pi_at_id = db.Column(db.Integer, db.ForeignKey('supplier_invoices.id'),
      nullable=False)
  at_date = relationship("supplier_invoices")

  def __init__(self, id, pi_shortnumber):
    self.id = id
    self.pi_shortnumber = pi_shortnumber


@app.route('/pro_inv/')
def product_inv():
    return render_template('product_inventory.html', 
      product_query = product_inventory.query.order_by(product_inventory.pi_shortnumber.desc()).limit(20).all())

然后假设我们使用以下jinja2 模板以表格形式显示query

{% for pq in product_query %}
<tr>
    <td>
        {{ pi.at_date }}
    </td>
    <td>
        {{ pi.pi_lot_name }}
    </td>
    <td>
        {{ <!-- at_shortnumber --> }} <!-- ******* HOW TO GET SECOND COLUMN DATA HERE? -->
    </td>
    <td>
</tr>
{% endfor %}

如您所见,使用sqlalchemy 关系检索第一列数据pi.at_date 相对简单。生成的jinja2 表显示来自supplier_invoices 子表的at_date,旁边是来自与其连接的父product_inventory 表的相应pi_lot_name 列数据。

但是,此 relationship 仅返回 at_date 列。

如何在同一个model 中检索at_shortnumber 列,以便将其与at_date 列一起显示?

显然,一种解决方案是创建一个新的独立 model 关系,但这对我来说似乎很麻烦,因为如果要检索 10 列,我们必须建立 10 个独立的 model 关系。

对于如何使用相同的model 从相关表中检索多列数据有任何建议吗?或者可能是完全不同的方式来实现相同的结果?

提前谢谢你!

编辑:另外,如何将父模型类中的父名称分配给子列数据,以便可以直接从模型类操作数据?例如,如果希望使用:concat = column_property(pi_shortnumber + "_" + pi_lot_name + "_" + at_shortnumber )

【问题讨论】:

    标签: python python-3.x flask jinja2 flask-sqlalchemy


    【解决方案1】:

    您可以通过pd.at_date.at_shortnumber 访问它。从您的代码pq.at_date 返回对应的SupplierInvoicesat_date 值,这是正确的,它实际上所做的是pq.at_date.at_date。但是你让它与supplier_invoices.at_date 共享名称,因此会造成混淆。更改supplier_invoices.at_date 的列名称或product_inventory.at_date 的关系名称。

    【讨论】:

    • 谢谢!此外,如果您能帮助我进行上述编辑,我们将不胜感激。
    猜你喜欢
    • 2015-11-22
    • 2023-04-01
    • 1970-01-01
    • 2020-02-08
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多