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?

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)


53

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


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 %}

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()


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

-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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.