El objeto ManyRelatedManager no es iterable

94

Tratando de hacer esto:

Actualizado:

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

y consigue esto ...

'ManyRelatedManager' object is not iterable

Ambos campos son muchos, entonces, ¿cómo se puede hacer?

jason
fuente

Respuestas:

106

Tratar

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

Observe el paréntesis al final de WishList.attribute_answers.all(). Agregar el paréntesis invoca la allfunción para devolver un iterable.

Si incluye el paréntesis, está diciendo "dame todos los valores en las respuestas de las tiendas siempre que ese valor también esté en las respuestas de las listas de deseos". Sin el paréntesis, está solicitando todos los valores de las respuestas de la tienda que también están en la allfunción, lo cual no tiene sentido. La función all no es iterable (es una función que devuelve un iterable)

Aidan Ewen
fuente
53

parece que estás buscando algo como Store.attribute_answers.all()

segundo
fuente
28

Si está haciendo esto en una plantilla:

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

ACTUALIZAR

Si tiene una tabla de paso, puede acceder a los elementos de esa tabla (como se detalla aquí ) así (tenga en cuenta que usa el nombre de la tabla de paso, en minúsculas, con el sufijo _set):

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}
Andy
fuente
1
Gracias, este es un enfoque realmente limpio
MoltenMuffins
Gracias, esto fue realmente útil
MGLondon
25

TL; DR

Para todos los que encuentran código de lectura en preguntas como TL; DR

En vez de query_set.many_to_many

Deberías usar query_set.many_to_many.all()

Qback
fuente
1
Esta debería haber sido la respuesta aceptada, no puede ser más simple
malik bagwala
-1

Aquí busines_type es Foreign_key en el modelo de perfil

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
fuente
-1

Sigo respondiendo a esta pregunta cada vez que surge este problema. Particularmente cuando se intenta iterar sobre muchos en una función.

Como plantilla puedes hacer:

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