Django项目更新订单商品数量时出现AttributeError问题求助
解决Django中OrderItem无'order'属性的AttributeError问题
错误原因分析
你碰到的'OrderItem' object has no attribute 'order'错误根源很清晰:你的OrderItem模型里压根没定义order这个字段。看你的models.py代码,Order和OrderItem是用多对多字段关联的(Order.items = models.ManyToManyField(OrderItem)),这种关联关系下,OrderItem实例不会自动生成order属性——而且从电商业务逻辑来说,一个订单项通常只属于一个订单,用多对多其实不太合理,这才是问题的核心。
方案一:调整模型关系(推荐,贴合常规业务逻辑)
把Order和OrderItem改成外键关联,因为一个订单可以包含多个订单项,但一个订单项只会属于一个订单。修改models.py:
class OrderItem(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) ordered = models.BooleanField(default=False) item = models.ForeignKey(Item, on_delete=models.CASCADE) quantity = models.IntegerField(default=1) variation = models.ManyToManyField(Variation) # 新增外键关联到Order,related_name方便从Order反向查询订单项 order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items', null=True, blank=True) class Order(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) ordered = models.BooleanField(default=False) payment = models.ForeignKey( 'Payment', on_delete=models.SET_NULL, blank=True, null=True) received = models.BooleanField(default=False) # 删除原来的多对多字段 # items = models.ManyToManyField(OrderItem)
修改完成后,记得执行数据库迁移:
python manage.py makemigrations python manage.py migrate
之后你原来的错误代码行就能正常运行了:
if not order_item.order == order:
方案二:在现有多对多关系下修复判断逻辑
如果你暂时不想修改模型结构,可以通过Order的items字段来判断当前订单项是否属于该订单,替换错误行的代码:
if order_item not in order.items.all(): messages.info(request, "Product was not in your cart") return redirect("product", slug=item_slug)
不过这种方式在订单订单项较多时查询效率会比外键低,而且不符合常规的电商数据结构,所以更推荐方案一。
额外注意事项
- 如果你选择方案一,后续创建
OrderItem并关联到Order时,要记得给order_item.order赋值; - 你的模板代码没问题,隐藏字段正确传递了
order_item.pk,不需要调整。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

