'Flask SQLAlchemy join 2 tables
I have 2 related tables (Product, OrderItem) that I want to retrieve data from but can't seem to get my way around. I can only fetch data from the first table but not from the second one.
Here's my query in my route to fetch data from the 2 tables:
@admin.route('/generate/invoice/<order_number>')
def generate_invoice(order_number):
order = Order.query.filter_by(order_number=order_number).first()
products = Product.query.join(OrderItem, (Product.id==OrderItem.product_id)).filter_by(order_id=order.id).all()
rendered = render_template('pdfs/invoice_pdf.html', order=order, products=products)
So in my html I am able to get data from the first table using product.name but I fail to get data from the second table. I actually want to get the quantity of the product from OrderItem table using product.order_items.quantity. Here's the html I have to iterate over the results.
{% for product in products %}
<tr>
<td>{{ product.name }}</td>
<td>{{ product.order_items.quantity}}</td>
</tr>
{% endfor %}
The Product model is as follow
class Product(db.Model):
__tablename__ = 'products'
__searchable__ = ['name', 'description']
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(200))
description = db.Column(db.Text)
price = db.Column(db.Float(10, 2))
discount = db.Column(db.Float(10, 2))
quantity = db.Column(db.Integer)
image = db.Column(db.Text)
product_code = db.Column(db.Text, unique=True)
def __repr__(self):
return '<Product %r>' % self.name
The other related models
class Order(db.Model):
__tablename__ = 'orders'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
user_id = db.Column(db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False, index=True)
grand_total = db.Column(db.Float(10, 2), nullable=False)
status = db.Column(db.Enum('Pending', 'Completed', 'Cancelled', 'Dispatched'), nullable=False, default='Pending')
created = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
payment_type = db.Column(db.String(256), nullable=False)
order_number = db.Column(db.String(256), nullable=False)
user = db.relationship('User', primaryjoin='Order.user_id == User.id', backref='orders')
def __repr__(self):
return '<Order %r>' % self.id
class OrderItem(db.Model):
__tablename__ = 'order_items'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
order_id = db.Column(db.ForeignKey('orders.id', ondelete='CASCADE'), nullable=False, index=True)
product_id = db.Column(db.Integer, nullable=False)
item_price = db.Column(db.Float(10, 2), nullable=False)
quantity = db.Column(db.Integer, nullable=False)
order = db.relationship('Order', primaryjoin='OrderItem.order_id == Order.id', backref='order_items')
def __repr__(self):
return '<OrderItem %r>' % self.id
What could be wrong with my query or models because I get the following error when I run the code:
jinja2.exceptions.UndefinedError: 'core.models.Product object' has no attribute 'order_items'
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
