ManyRelatedManager对象是不可迭代的


94

尝试这样做:

更新:

wishList = WishList.objects.get(pk=20)
matches = [val for val in Store.attribute_answers.all() if val in wishList.attribute_answers]

并得到这个...

'ManyRelatedManager' object is not iterable

这两个领域都很多,那么该怎么办呢?

Answers:


106

尝试

matches = [val for val in Store.attribute_answers.all() if val in WishList.attribute_answers.all()]

请注意末尾的括号WishList.attribute_answers.all()。添加括号会调用该all函数以返回可迭代对象。

如果包含括号,则表示“只要希望清单中的答案也给我,商店中的所有值都将给出答案”。如果没有括号,则您要从商店的答案中索取所有值,这些值也包含在all函数中,这是没有意义的。all函数不是可迭代的(它是一个返回可迭代的函数)


53

听起来您正在寻找类似的东西 Store.attribute_answers.all()


28

如果您在模板中执行此操作:

{% for room in study.room_choice.all %}
  {{ room }}
  {% empty %}
  empty list!
{% endfor %}

更新

如果通过表有一个,你可以访问该表中的元素(详见这里),像这样(注意,您可以使用通过表名,小写字母,后面添加_set):

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}

1
谢谢,这是一种非常干净的方法
MoltenMuffins

谢谢,这真的很有帮助
MGLondon

25

TL; DR

对于所有发现问题中的代码为TL; DR的人

代替 query_set.many_to_many

你应该使用 query_set.many_to_many.all()


1
这应该是已被接受的答案,再简单不过了
malik bagwala

-1

在配置文件模型中,busines_type是foreign_key

pro = Profile.object.filter(user=myuser).first()
business_type = pro.business_type.all()
if business_type:
    b_type = ''
    for b in business_type:
        b_type += str(b.type)+' '
        a = b_type

-1

每当出现此问题时,我都会不断提出这个问题。尤其是在尝试实际迭代函数中的多个对象时。

作为模板,您可以执行以下操作:

array = many_to_many.all()
for x in many_to_many:
  function here
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.