簡體   English   中英

Flask SQLAlchemy 一對多關系查詢

[英]Flask SQLAlchemy One to Many Relationship Query

購物車項目是添加到購物車的產品。

將產品添加到購物車時,我會收到警報,例如 CartItem ID: 1 已添加到購物車。 如果再次添加相同的產品,我應該收到警報 CartItem ID:1 已經在購物車中。

現在,當我將相同的產品添加到購物車時,我收到 500 錯誤。 我應該如何查詢 cart_item?

模型.py

...
class Cart(db.Model):
    __tablename__ = 'cart'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    cart_items = db.relationship('CartItem', 
        foreign_keys='CartItem.cart_id', backref='cart', lazy='dynamic', cascade='all, delete-orphan')

    def __repr__(self):
        return '<Cart {}>'.format(self.user_id)


class CartItem(db.Model):
    __tablename__ = 'cart_item'
    id = db.Column(db.Integer, primary_key=True)
    product_id = db.Column(db.Integer, db.ForeignKey('product.id'))
    product = db.relationship('Product', backref=db.backref('cart_item', uselist=False)) 
    cart_id = db.Column(db.Integer, db.ForeignKey('cart.id'))

    def __repr__(self):
        return '<CartItem {}>'.format(self.product_id)
...

路線.py

...
@cart_blueprint.route('/add_item/<int:product_id>', methods=['GET', 'POST'])
@login_required
def add_item(product_id):
    product = Product.query.get_or_404(product_id)
    cart_id = current_user.id
    cart = Cart.query.get(int(cart_id))
    cart_item = {}
    
    if any(product.id==cart_item.product_id for cart_item in cart.cart_items):
        cart_item = CartItem.query.join(CartItem.product).filter(Product.id==cart_item.product_id).first()
        flash(f'CartItem ID: {cart_item.id} already in cart')
...

回溯錯誤

cart_item = CartItem.query.join(CartItem.product).filter(Product.id==cart_item.product_id).first() AttributeError: 'dict' object 沒有屬性 'product_id'

謝謝各位指點。 我解決了使用 Cart 和 CartItem 之間的自引用一對多關系查詢 cart_item 的問題。

模型.py

...
from app import db

class Cart(db.Model):
    __tablename__ = 'cart'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    cart_items = db.relationship('CartItem', 
        foreign_keys='CartItem.cart_id', backref='cart', lazy='dynamic', cascade='all, delete-orphan')

    def __repr__(self):
        return '<Cart {}>'.format(self.user_id)


class CartItem(db.Model):
    __tablename__ = 'cart_item'
    id = db.Column(db.Integer, primary_key=True)
    product_id = db.Column(db.Integer, db.ForeignKey('product.id'))
    product = db.relationship('Product', backref=db.backref('cart_item', uselist=False)) 
    cart_id = db.Column(db.Integer, db.ForeignKey('cart.id'))
    # 'cart' property defined in Cart.cart_items via backref.

    def __repr__(self):
        return '<CartItem {}>'.format(self.product_id)
...

路線.py

...
from sqlalchemy.orm import aliased

@cart_blueprint.route('/add_item/<int:product_id>', methods=['GET', 'POST'])
@login_required
def add_item(product_id):
    product = Product.query.get_or_404(product_id)
    cart_id = current_user.id
    cart = Cart.query.get(int(cart_id))
    cart_item = {}
    
    if any(product.id==cart_item.product_id for cart_item in cart.cart_items):
        cart_item = CartItem.query.filter(CartItem.product_id==product_id).\
                                    join(CartItem.cart).\
                                    filter(Cart.id==cart_id).first()
        flash(f'CartItem ID: {cart_item.id} already in cart')
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM