'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