ManyRelatedManagerオブジェクトは反復可能ではありません


94

これをしようとしています:

更新しました:

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

そしてこれを入手...

'ManyRelatedManager' object is not iterable

どちらのフィールドもmanytomanyなので、これをどのように行うことができますか?

回答:


106

試す

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

の末尾の括弧に注意してくださいWishList.attribute_answers.all()。括弧を追加すると、all関数が呼び出され、イテラブルが返されます。

かっこを含めると、「その値がウィッシュリストの回答にも含まれている限り、店舗のすべての値を回答してください」と言います。括弧がない場合は、all関数内にも存在するストアの回答からのすべての値を求めているため、意味がありません。all関数は反復可能ではありません(反復可能を返す関数です)


53

あなたは何かを探しているように聞こえます Store.attribute_answers.all()


28

テンプレートでこれを行っている場合:

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

更新

スルーテーブルがある場合は、そのように(ここで詳しく説明するように)そのテーブルの要素にアクセスできます(注、スルーテーブル名は小文字で_setの接尾辞を付けて使用します)。

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}

1
ありがとうこれは本当にクリーンなアプローチです
MoltenMuffins

ありがとう、これは本当に役に立ちました
MGLondon

25

TL; DR

TL; DRとして質問でコードを読んでいると気付いたすべての人

の代わりに query_set.many_to_many

あなたは使うべきです query_set.many_to_many.all()


1
これは、任意の簡素得ることができない、受け入れ答えされている必要があります
マリクbagwala

-1

ここで、busines_typeはプロファイルモデルのforeign_keyです。

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

この問題が発生するたびに、私はこの質問を続けます。特に、関数内のmanytomanyを実際に反復しようとする場合。

テンプレートとしてできること:

array = many_to_many.all()
for x in many_to_many:
  function here
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.