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?

Jason
quelle

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)

Aidan Ewen
quelle
53

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

zweite
quelle
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 %}
andyw
quelle
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()

Qback
quelle
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
Nids Barthwal
quelle
-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
Alex Tomlinson
quelle