L'objet ManyRelatedManager n'est pas itérable

94

Essayer de faire ceci:

Actualisé:

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

et obtenez ceci ...

'ManyRelatedManager' object is not iterable

Les deux domaines sont nombreux, comment cela peut-il être fait?

Jason
la source

Réponses:

106

Essayer

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

Remarquez la parenthèse à la fin de WishList.attribute_answers.all(). L'ajout de parenthèses appelle la allfonction pour renvoyer un itérable.

Si vous incluez les parenthèses, vous dites "donnez-moi toutes les valeurs dans les réponses des magasins tant que cette valeur est également dans les réponses des listes de souhaits". Sans les parenthèses, vous demandez toutes les valeurs des réponses du magasin qui sont également dans la allfonction, ce qui n'a pas de sens. La fonction all n'est pas un itérable (c'est une fonction qui retourne un itérable)

Aidan Ewen
la source
53

on dirait que vous cherchez quelque chose comme Store.attribute_answers.all()

seconde
la source
28

Si vous faites cela dans un modèle:

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

METTRE À JOUR

Si vous avez une table through, vous pouvez accéder aux éléments de cette table (comme détaillé ici ) comme ceci (notez que vous utilisez le nom de la table through, en minuscules, avec le suffixe _set):

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}
Andyw
la source
1
Merci, c'est une approche vraiment propre
MoltenMuffins
Merci, cela a été vraiment utile
MGLondon
25

TL; DR

Pour tous ceux qui trouvent le code de lecture dans les questions comme TL; DR

Au lieu de query_set.many_to_many

Tu devrais utiliser query_set.many_to_many.all()

Qback
la source
1
Cela aurait dû être la réponse acceptée, ne peut pas être plus simple
malik bagwala le
-1

Ici busines_type est une clé étrangère dans le modèle de profil

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
la source
-1

Je continue à répondre à cette question chaque fois que ce problème survient. En particulier lorsque vous essayez d'itérer réellement sur un manytomany dans une fonction.

En tant que modèle, vous pouvez faire:

array = many_to_many.all()
for x in many_to_many:
  function here
Alex Tomlinson
la source