从关系属性访问列值

时间:2018-11-11 11:35:32

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

假设以下示例中,我们有两个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 %}

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

但是,此relationship仅返回at_date列。

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

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

对于使用相同的model从相关表中检索多列数据的人,会有任何建议吗?还是完全不同的方式来获得相同的结果?

提前谢谢!

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

1 个答案:

答案 0 :(得分:1)

您可以以pd.at_date.at_shortnumber的身份访问它。从您的代码pq.at_date中返回正确的核心at_date的{​​{1}}值,实际上是SupplierInvoices。但是您需要与pq.at_date.at_date共享名称,因此会造成混乱。要么更改supplier_invoices.at_date的列名,要么更改supplier_invoices.at_date的关系名。