L'oggetto ManyRelatedManager non è iterabile


94

Provando a fare questo:

Aggiornato:

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

e prendi questo ...

'ManyRelatedManager' object is not iterable

Entrambi i campi sono molti, quindi come può essere fatto?

Risposte:


106

Provare

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

Notare la parentesi alla fine di WishList.attribute_answers.all(). L'aggiunta delle parentesi richiama la allfunzione per restituire un iterabile.

Se includi la parentesi stai dicendo "dammi tutti i valori nelle risposte dei negozi purché quel valore sia anche nelle risposte delle liste dei desideri". Senza parentesi stai chiedendo tutti i valori dalle risposte del negozio che sono anche nella allfunzione, che è priva di significato. La funzione all non è un iterabile (è una funzione che restituisce un iterabile)


53

sembra che tu stia cercando qualcosa di simile Store.attribute_answers.all()


28

Se lo stai facendo in un modello:

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

AGGIORNARE

Se hai una tabella passante, puoi accedere agli elementi in quella tabella (come dettagliato qui ) in questo modo (nota, usi il nome della tabella passante, in minuscolo, suffisso _set):

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

1
Grazie, questo è un approccio davvero pulito
MoltenMuffins

Grazie, è stato davvero utile
MGLondon

25

TL; DR

Per tutti coloro che trovano codice di lettura nelle domande come TL; DR

Invece di query_set.many_to_many

dovresti usare query_set.many_to_many.all()


1
Questa avrebbe dovuto essere la risposta accettata, non può essere più semplice
malik bagwala

-1

Qui busines_type è foreign_key nel modello di profilo

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

Continuo a rispondere a questa domanda ogni volta che si presenta questo problema. Soprattutto quando si cerca di iterare effettivamente su molte persone in una funzione.

Come modello puoi fare:

array = many_to_many.all()
for x in many_to_many:
  function here
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.