Django访问ManyToManyField报ManyRelatedManager不可迭代错误
问题根因
报错核心原因是多对多关联字段的查询写法错误:代码里写的.all没有加执行括号,赋值给products变量的是ManyRelatedManager的方法引用本身,而不是调用all()后返回的可迭代QuerySet对象,因此遍历时触发不可迭代错误。
修复方案
修改views.py中的关联查询逻辑,给all加上括号执行查询即可,同时优化实例获取逻辑避免无匹配数据时抛索引错误,修复后的代码如下:
def checkOut(request): user = request.user # 用first()替代[0]索引,无匹配数据时返回None而非直接抛IndexError form_obj = Form.objects.filter(user_name=user.username).first() if not form_obj: # 此处可补充无对应表单的业务逻辑,比如跳转回表单填写页 products = [] else: # 给all加括号,调用后返回可遍历的关联产品QuerySet products = form_obj.products.all() for product in products: print(product.title)
注意事项
- Django所有关联字段(外键、多对多、一对一)的管理器方法,都需要加括号调用才能返回结果集,直接写方法名只会拿到方法引用,无法直接遍历
- 如果需要对关联产品做筛选、排序,也可以在管理器后链式调用对应方法,比如
form_obj.products.filter(is_on_sale=True).order_by('-create_time')
内容的提问来源于stack exchange,提问作者Alireza
相关产品推荐
相关产品推荐

