Das ManyRelatedManager-Objekt ist nicht iterierbar


93

Der Versuch, dies zu tun:

Aktualisiert:

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

und hol dir das ...

'ManyRelatedManager' object is not iterable

Beide Bereiche sind vielfältig. Wie kann dies getan werden?

Antworten:


105

Versuchen

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

Beachten Sie die Klammer am Ende von WishList.attribute_answers.all(). Durch Hinzufügen der Klammer wird die aufgerufenall Funktion aufgerufen, eine Iterable zurückzugeben.

Wenn Sie die Klammer einfügen, sagen Sie "Geben Sie mir alle Werte in den Filialantworten, solange dieser Wert auch in den Antworten auf den Wunschzettel enthalten ist". Ohne die Klammer fragen Sie nach allen Werten aus den Antworten des Geschäfts, die sich auch in der allFunktion befinden, was bedeutungslos ist. Die all-Funktion ist keine iterable (es ist eine Funktion, die eine iterable zurückgibt)


53

klingt wie Sie nach etwas suchen wie Store.attribute_answers.all()


28

Wenn Sie dies in einer Vorlage tun:

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

AKTUALISIEREN

Wenn Sie eine Through-Tabelle haben, können Sie wie folgt auf die Elemente in dieser Tabelle zugreifen (wie hier beschrieben ) (beachten Sie, dass Sie den Through-Tabellennamen in Kleinbuchstaben mit dem Suffix _set verwenden):

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}

1
Vielen Dank, dies ist ein wirklich sauberer Ansatz
MoltenMuffins

Danke, das war wirklich hilfreich
MGLondon

24

TL; DR

Für alle, die das Lesen von Code in Fragen als TL; DR finden

Anstatt query_set.many_to_many

du solltest benutzen query_set.many_to_many.all()


1
Dies hätte die akzeptierte Antwort sein sollen, einfacher geht es nicht
Malik Bagwala

-1

Hier ist busines_type im Profilmodell 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

Ich stelle diese Frage immer wieder, wenn dieses Problem auftritt. Insbesondere, wenn versucht wird, eine Vielzahl von Funktionen zu durchlaufen.

Als Vorlage können Sie Folgendes tun:

array = many_to_many.all()
for x in many_to_many:
  function here
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.