Об'єкт 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

Обидва поля є чималими, тож як це можна зробити?

Відповіді:


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

Дякую, це було дуже корисно
MGondon

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.