Объект ManyRelatedManager не повторяется

96

Пытаюсь сделать это:

Обновлено:

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

Обе области очень много, так как же это сделать?

Джейсон
источник

Ответы:

108

Пытаться

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
28

TL; DR

Для всех, кто находит чтение кода в вопросах как TL; DR

Вместо того query_set.many_to_many

ты должен использовать query_set.many_to_many.all()

Qback
источник
1
Это должен был быть принятый ответ, не может быть проще
Малик Багвала
-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
Алекс Томлинсон
источник