ManyRelatedManager nesnesi yinelenemez


96

Bunu yapmaya çalışıyorum:

Güncellenmiş:

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

ve bunu al ...

'ManyRelatedManager' object is not iterable

Her iki alan da çoktur, peki bu nasıl yapılabilir?

Yanıtlar:


108

Deneyin

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

Sonundaki paranteze dikkat edin WishList.attribute_answers.all(). Parantez eklemek, allişlevi bir yinelenebilir döndürmek için çağırır.

Parantezi eklerseniz, "istek listeleri cevaplarında da bu değer olduğu sürece bana mağazalardaki tüm değerleri verin" diyorsunuz. Parantez olmadan, mağazanın yanıtlarından, allişlevde de bulunan ve anlamsız olan tüm değerleri istersiniz . All işlevi yinelenemez (yinelenebilir döndüren bir işlevdir)


53

gibi bir şey arıyormuşsun gibi geliyor Store.attribute_answers.all()


28

Bunu bir şablonda yapıyorsanız:

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

GÜNCELLEME

Bir geçiş tablonuz varsa, bu tablodaki öğelere ( burada ayrıntılı olarak açıklandığı gibi) şu şekilde erişebilirsiniz (not, geçiş tablosu adını, küçük harfle, _set son ekini kullanırsınız):

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

1
Teşekkürler, bu gerçekten temiz bir yaklaşım
MoltenMuffins

Teşekkürler, bu gerçekten yardımcı oldu
MGLondon

28

TL; DR

Sorularda okuma kodunu TL olarak bulan herkes için ; DR

Onun yerine query_set.many_to_many

kullanmalısın query_set.many_to_many.all()


1
Bu kabul edilen cevap olmalıydı, daha basit
olamazdı

-1

Burada busines_type, profil modelinde foreign_key'dir

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

Bu sorun ortaya çıktığında bu soruyu sormaya devam ediyorum. Özellikle, bir işlevde bir çok topluma üzerinde yinelemeye çalışırken.

Şablon olarak şunları yapabilirsiniz:

array = many_to_many.all()
for x in many_to_many:
  function here
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.