121 votes

L'objet ManyRelatedManager n'est pas itérable.

J'essaie de le faire :

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

Et écoutez ça...

'ManyRelatedManager' object is not iterable

Les deux champs sont de type many-to-many, comment faire ?

136voto

Aidan Ewen Points 4364

Essayez

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 la parenthèse invoque la fonction all pour retourner un itérable.

Si vous incluez la parenthèse, vous dites "donnez-moi toutes les valeurs des réponses des magasins, à condition qu'elles figurent également dans les réponses des listes de souhaits". Sans la parenthèse, vous demandez toutes les valeurs des réponses du magasin qui se trouvent également dans les listes de souhaits. all ce qui n'a aucun sens. La fonction all n'est pas un itérable (c'est une fonction qui retourne un itérable).

66voto

second Points 11641

On dirait que vous cherchez quelque chose comme

Store.attribute_answers.all()

50voto

andyw Points 590

Si vous faites cela dans un modèle :

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

UPDATE

Si vous disposez d'une table de passage, vous pouvez accéder aux éléments de cette table (comme indiqué en détail dans le tableau ci-dessous). aquí ) comme suit (notez que vous utilisez le nom de la table en entier, en minuscules, avec le suffixe _set) :

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

42voto

Qback Points 1138

all()

Pour tous ceux qui trouvent que lire le code dans les questions comme TL;DR

Au lieu de query_set.many_to_many

vous devez utiliser query_set.many_to_many.all()

-1voto

Alex Tomlinson Points 9

Je continue à répondre à cette question chaque fois que ce problème se présente. En particulier lorsque j'essaie d'itérer sur un grand nombre de personnes dans une fonction.

Comme modèle, vous pouvez le faire :

array = many_to_many.all()
for x in many_to_many:
  function here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X