如何在循环中访问ForeignKey关联模型属性?解决购物车库存验证报错
问题
我开发了一个购物车视图,需求是:当用户已认证且购物车中有商品时,检查商品的库存可用性(availability),若存在任意商品的availability为False,则渲染“缺货”提示。目前未认证用户的代码可正常运行,但已认证用户的代码抛出报错:'OrderItem' object has no attribute 'availability'。
相关代码
Models
class Product(models.Model): availability = models.BooleanField() class OrderItem(models.Model): product = models.ForeignKey(Product) order = models.ForeignKey(Order)
Views
def cart(request): data = cartData(request) items = data['items'] orderitemlist = OrderItem.objects.all() if not request.user.is_authenticated: available = all(x['product']['availability'] for x in items) else: available = all(x.availability for x in orderitemlist) context = {"items": items, 'available': available}
Template
{% if available %} <a href="#">Checkout</a> {% else %} <p>Out of stock</p> {% endif %}
请问如何解决该问题,正确在循环中访问ForeignKey关联的Product模型的availability属性?
解决方法
错误根源
OrderItem模型本身并不存在availability字段,这个字段属于其关联的Product模型,直接通过x.availability访问必然触发属性不存在的报错。同时原代码中OrderItem.objects.all()会取出系统中所有用户的订单商品,逻辑上不符合“当前用户购物车”的需求。
修正步骤
修正字段访问路径
通过ForeignKey关联的product属性,访问关联商品的availability字段,修改已认证用户分支的代码:available = all(x.product.availability for x in orderitemlist)筛选当前用户的购物车商品
先获取当前已认证用户的未完成订单(即购物车),再取出该订单下的所有商品:# 假设Order模型有user字段关联用户,且complete字段标记订单是否完成 order, created = Order.objects.get_or_create(user=request.user, complete=False) orderitemlist = order.orderitem_set.all()完整修正后的Views代码
def cart(request): data = cartData(request) items = data['items'] if not request.user.is_authenticated: available = all(x['product']['availability'] for x in items) else: # 获取当前用户的未完成订单(购物车) order, created = Order.objects.get_or_create(user=request.user, complete=False) # 取出该订单下的所有商品 orderitemlist = order.orderitem_set.all() # 正确访问关联商品的库存状态 available = all(x.product.availability for x in orderitemlist) context = {"items": items, 'available': available} return render(request, '你的购物车模板路径', context)
性能优化
为避免N+1查询问题(每个OrderItem单独查询一次Product),可以在查询时预加载关联的Product数据:
orderitemlist = order.orderitem_set.select_related('product').all()
内容的提问来源于stack exchange,提问作者betty_
相关产品推荐
相关产品推荐

