O objeto ManyRelatedManager não é iterável

94

Tentando fazer isso:

Atualizada:

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

e pegue isso ...

'ManyRelatedManager' object is not iterable

Ambos os campos são muitos a muitos, então como isso pode ser feito?

Jason
fonte

Respostas:

106

Experimentar

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

Observe o parêntese no final de WishList.attribute_answers.all(). Adicionar o parêntese invoca a allfunção para retornar um iterável.

Se você incluir os parênteses, estará dizendo "dê-me todos os valores nas respostas das lojas, desde que esse valor também esteja nas respostas da lista de desejos". Sem os parênteses, você está pedindo todos os valores das respostas da loja que também estão na allfunção, o que não tem sentido. A função all não é iterável (é uma função que retorna um iterável)

Aidan Ewen
fonte
53

parece que você está procurando por algo como Store.attribute_answers.all()

segundo
fonte
28

Se você estiver fazendo isso em um modelo:

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

ATUALIZAR

Se você tiver uma tabela through, poderá acessar os elementos dessa tabela (conforme detalhado aqui ) da seguinte forma (observe, você usa o nome da tabela through, em minúsculas, com o sufixo _set):

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}
andyw
fonte
1
Obrigado, esta é uma abordagem realmente limpa
MoltenMuffins
Obrigado, isso foi muito útil
MGLondon
25

TL; DR

Para todos que encontram a leitura de código em questões como TL; DR

Ao invés de query_set.many_to_many

você deveria usar query_set.many_to_many.all()

Qback
fonte
1
Esta deveria ter sido a resposta aceita, não posso ficar mais simples
malik bagwala
-1

Aqui busines_type é foreign_key no 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
fonte
-1

Eu continuo fazendo essa pergunta sempre que esse problema surge. Particularmente ao tentar iterar de fato ao longo de muitos em uma função.

Como modelo, você pode fazer:

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