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?

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)


53

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


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

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


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

-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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.