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?

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)


53

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


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

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


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

-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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.