Đối tượng ManyRelatedManager không thể lặp lại


94

Đang cố gắng làm điều này:

Đã cập nhật:

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

và lấy cái này ...

'ManyRelatedManager' object is not iterable

Cả hai lĩnh vực đều là nhiều yếu tố, vậy làm thế nào để có thể thực hiện được điều này?

Câu trả lời:


106

Thử

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

Chú ý dấu ngoặc ở cuối WishList.attribute_answers.all(). Thêm dấu ngoặc đơn gọi allhàm để trả về một giá trị có thể lặp lại.

Nếu bạn bao gồm dấu ngoặc đơn, bạn đang nói "cho tôi tất cả các giá trị trong cửa hàng câu trả lời, miễn là giá trị đó cũng nằm trong câu trả lời của danh sách mong muốn". Nếu không có dấu ngoặc đơn, bạn đang yêu cầu tất cả các giá trị từ câu trả lời của cửa hàng cũng có trong allhàm, điều này là vô nghĩa. Hàm all không phải là hàm có thể lặp lại (đó là hàm trả về có thể lặp lại)


53

có vẻ như bạn đang tìm kiếm một cái gì đó giống như Store.attribute_answers.all()


28

Nếu bạn đang làm điều này trong một mẫu:

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

CẬP NHẬT

Nếu bạn có một bảng thông qua, bạn có thể truy cập các phần tử trong bảng đó (chi tiết ở đây ) như vậy (lưu ý, bạn sử dụng tên bảng thông qua, ở dạng chữ thường, có hậu tố _set):

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

1
Cảm ơn đây là một cách tiếp cận thực sự sạch sẽ
MoltenMuffins

Cảm ơn, điều này thực sự hữu ích
MGLondon

25

TL; DR

Dành cho tất cả những ai tìm thấy mã đọc trong câu hỏi dưới dạng TL; DR

Thay vì query_set.many_to_many

bạn nên sử dụng query_set.many_to_many.all()


1
Đây lẽ ra phải là câu trả lời được chấp nhận, không thể đơn giản hơn
malik bagwala

-1

Đây busines_type là Foreign_key trong mô hình hồ sơ

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

Tôi tiếp tục đánh câu hỏi này bất cứ khi nào vấn đề này xuất hiện. Đặc biệt là khi cố gắng thực sự lặp lại nhiều hàm trong một hàm.

Như một mẫu bạn có thể làm:

array = many_to_many.all()
for x in many_to_many:
  function here
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.