118

尝试这样做:

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

这两个字段都是多对多的,那么如何做到这一点?

4

6 回答 6

131

尝试

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

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

如果您包含括号,您的意思是“给我商店答案中的所有值,只要该值也在愿望清单答案中”。如果没有括号,您将要求商店答案中的所有值也在all函数中,这是没有意义的。all 函数不是可迭代的(它是一个返回可迭代的函数)

于 2013-02-17T12:17:15.123 回答
63

听起来你正在寻找类似的东西

Store.attribute_answers.all()
于 2013-02-17T12:16:29.343 回答
49

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

{% 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 %}
于 2019-01-18T10:58:21.787 回答
38

all()

对于在TL;DR等问题中发现阅读代码的每个人

代替query_set.many_to_many

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

于 2018-07-24T14:55:29.107 回答
-1

每当出现这个问题时,我都会不断提出这个问题。特别是在尝试实际迭代函数中的多态时。

作为模板,您可以:

array = many_to_many.all()
for x in many_to_many:
  function here
于 2020-01-10T13:55:07.030 回答
-2

这里的 busines_type 是 profile 模型中的 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
于 2019-03-14T10:10:42.660 回答