วัตถุ ManyRelatedManager ไม่สามารถทำซ้ำได้


96

พยายามทำสิ่งนี้:

อัปเดต:

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

ทั้งสองช่องมีจำนวนมากดังนั้นจะทำได้อย่างไร?

คำตอบ:


108

ลอง

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

สังเกตวงเล็บท้ายWishList.attribute_answers.all(). การเพิ่มวงเล็บจะเรียกใช้allฟังก์ชันเพื่อส่งคืนค่าที่ทำซ้ำได้

หากคุณใส่วงเล็บแสดงว่า "ให้ค่าทั้งหมดในร้านค้าตอบตราบใดที่ค่านั้นอยู่ในคำตอบของรายการความปรารถนา" หากไม่มีวงเล็บคุณจะขอค่าทั้งหมดจากคำตอบของร้านค้าที่อยู่ใน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

28

TL; ดร

สำหรับทุกคนที่พบว่ากำลังอ่านรหัสในคำถามเป็นTL; DR

แทน query_set.many_to_many

คุณควรใช้ query_set.many_to_many.all()


1
นี่ควรเป็นคำตอบที่ยอมรับไม่ได้ง่ายกว่านี้
malik 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

ฉันมักจะตอบคำถามนี้ทุกครั้งที่มีปัญหานี้เกิดขึ้น โดยเฉพาะอย่างยิ่งเมื่อพยายามทำซ้ำหลาย ๆ ฟังก์ชันในฟังก์ชัน

ในฐานะเทมเพลตคุณสามารถทำได้:

array = many_to_many.all()
for x in many_to_many:
  function here
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.