Django运行报'ManyRelatedManager' object is not iterable错误如何解决
错误产生原因
你的Post模型中categories字段为ManyToManyField(多对多字段),Django中多对多字段默认返回的是ManyRelatedManager管理对象,而非可直接遍历的关联数据集合。你在模板中直接用{% for cate in post.categories %}遍历该管理对象,就会触发这个TypeError。
修复方案
有两种可选修复方式,按需选择即可:
- 方案1(最简修改,直接改模板):将模板中遍历分类的代码修改为遍历关联数据的查询集,也就是把
改为{% for cate in post.categories %}
调用管理对象的{% for cate in post.categories.all %}all()方法即可返回所有关联的分类数据,可正常遍历。 - 方案2(性能优化版,改视图+模板):如果站点数据量较大,推荐在视图层用
prefetch_related预加载多对多关联数据,避免循环渲染时产生大量重复数据库查询(N+1查询问题):- 修改视图层查询代码:
def index(request): parms = { 'posts': Post.objects.filter(publish=True).prefetch_related('categories'), } return render(request, 'index.html', parms) - 同步按照方案1的方式修改模板中的遍历代码即可。
- 修改视图层查询代码:
内容的提问来源于stack exchange,提问作者Mehedi Hasan Shakil
相关产品推荐
相关产品推荐

