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?

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)


53

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


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

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


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

-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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.