Objek ManyRelatedManager tidak dapat diulang

96

Mencoba melakukan ini:

Diperbarui:

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

dan dapatkan ini ...

'ManyRelatedManager' object is not iterable

Kedua bidang ini banyak sekali jadi bagaimana ini bisa dilakukan?

jason
sumber

Jawaban:

108

Mencoba

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

Perhatikan tanda kurung di akhir WishList.attribute_answers.all(). Menambahkan tanda kurung akan memanggil allfungsi untuk mengembalikan iterable.

Jika Anda memasukkan tanda kurung, Anda mengatakan "beri saya semua nilai di toko jawaban selama nilai itu juga ada dalam daftar jawaban yang diinginkan". Tanpa tanda kurung Anda meminta semua nilai dari jawaban toko yang juga ada dalam allfungsi, yang tidak ada artinya. Semua fungsi bukan iterable (ini adalah fungsi yang mengembalikan iterable)

Aidan Ewen
sumber
53

terdengar seperti Anda mencari sesuatu seperti Store.attribute_answers.all()

kedua
sumber
28

Jika Anda melakukan ini di template:

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

MEMPERBARUI

Jika Anda memiliki tabel through, Anda dapat mengakses elemen dalam tabel itu (seperti yang dijelaskan di sini ) seperti itu (perhatikan, Anda menggunakan nama tabel through, dalam huruf kecil, suffixing _set):

{% for roominfo in participant.roomchoicethru_set.all %}
  {{ roominfo.room}} {{ roominfo.telnumber}}
{% endfor %}
andyw
sumber
1
Terima kasih, ini adalah pendekatan yang sangat bersih
MoltenMuffins
Terima kasih, ini sangat membantu
MGLondon
28

TL; DR

Untuk semua orang yang menemukan membaca kode dalam pertanyaan sebagai TL; DR

Dari pada query_set.many_to_many

kamu harus menggunakan query_set.many_to_many.all()

Qback
sumber
1
Ini seharusnya jawaban yang diterima, tidak bisa lebih sederhana
malik bagwala
-1

Di sini busines_type adalah foreign_key dalam model profil

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

Saya terus menanyakan pertanyaan ini setiap kali masalah ini muncul. Terutama ketika mencoba untuk benar-benar mengulang banyak dari banyak fungsi.

Sebagai templat, Anda dapat melakukan:

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