Объект 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 не является итерируемой (это функция, которая возвращает итерацию)



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()


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.