[英]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.