Obiekt ManyRelatedManager nie jest iterowalny

96

Próbuję to zrobić:

Zaktualizowano:

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

i weź to ...

'ManyRelatedManager' object is not iterable

Obydwa pola są liczne, więc jak można to zrobić?

Jason
źródło

Odpowiedzi:

108

Próbować

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

Zwróć uwagę na nawias na końcu WishList.attribute_answers.all(). Dodanie nawiasu wywołuje allfunkcję zwracającą iterowalną.

Jeśli dodasz nawias, mówisz „podaj mi wszystkie wartości w sklepach odpowiedzi, o ile ta wartość jest również na liście życzeń odpowiedzi”. Bez nawiasów pytasz o wszystkie wartości z odpowiedzi sklepu, które również znajdują się w allfunkcji, która jest bez znaczenia. Funkcja all nie jest iterowalna (jest to funkcja, która zwraca iterowalną)

Aidan Ewen
źródło
53

brzmi, jakbyś szukał czegoś takiego Store.attribute_answers.all()

druga
źródło
28

Jeśli robisz to w szablonie:

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

AKTUALIZACJA

Jeśli masz tabelę przelotową, możesz uzyskać dostęp do elementów w tej tabeli (zgodnie z opisem tutaj ) w ten sposób (uwaga, używasz nazwy tabeli przelotowej, małymi literami, z przyrostkiem _set):

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}
andyw
źródło
1
Dzięki temu jest to naprawdę czyste podejście
MoltenMuffins
Dzięki, to było bardzo pomocne
MGLondon
28

TL; DR

Dla każdego, kto w pytaniach odnajduje kod do czytania jako TL; DR

Zamiast query_set.many_to_many

powinieneś użyć query_set.many_to_many.all()

Qback
źródło
1
To powinna być akceptowana odpowiedź, nie może być prostsza
malik bagwala
-1

Tutaj busines_type to Foreign_key w modelu profilu

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
Nids Barthwal
źródło
-1

Ciągle zadaję to pytanie, gdy pojawia się ten problem. Szczególnie, gdy próbujemy dokonać iteracji po wielu tomach w funkcji.

Jako szablon możesz:

array = many_to_many.all()
for x in many_to_many:
  function here
Alex Tomlinson
źródło