TypeError: วัตถุ 'RelatedManager' ไม่สามารถทำซ้ำได้


87

Django

ฉันมีรุ่นต่อไป:

class Group(models.Model):
    name = models.CharField(max_length=100)
    parent_group = models.ManyToManyField("self", blank=True)

    def __unicode__(self):
        return self.name


class Block(models.Model):

    name = models.CharField(max_length=100)
    app = models.CharField(max_length=100)
    group = models.ForeignKey(Group)

    def __unicode__(self):
        return self.name

พูดว่าบล็อกb1มีกลุ่มg1 โดยมันชื่อฉันต้องการที่จะได้รับบล็อคทั้งหมดจากกลุ่มG1 ฉันเขียนฟังก์ชันเรียกซ้ำถัดไป:

def get_blocks(group):

    def get_needed_blocks(group):
        for block in group.block_set:
            blocks.append(block)

        if group.parent_group is not None:
            get_needed_blocks(group.parent_group)

    blocks = []
    get_needed_blocks(group)
    return blocks

แต่b1.group.block_setส่งคืนอ็อบเจ็กต์RelatedManagerให้ฉันซึ่งไม่สามารถทำซ้ำได้

จะทำอย่างไร? มีอะไรผิดปกติ

คำตอบ:


180

ลองสิ่งนี้:

block in group.block_set.all()

9
มีใครรู้บ้างว่าทำไม RelatedManager ถึงไม่ได้ทำซ้ำ? ฉันคาดหวังว่ามันจะเป็นแบบนั้น ...
stalepretzel

2
ความคิดเห็นนี้ช้าไปหน่อย แต่เหตุผลก็คือคุณสามารถใช้วิธีการกรองบนตัวจัดการเพื่อ จำกัด การสืบค้นก่อนที่จะทำการดึงข้อมูลไปยังฐานข้อมูล
วงรี

8
@stalepretzel เพราะมันทำงานได้เหมือนกับผู้จัดการ django มาตรฐาน คุณไม่เรียก Model.objects และทำซ้ำ คุณเรียก Model.objects.all () จากนั้นคุณทำซ้ำ ผู้จัดการ Django = / = Django queryset
Saturnix

และถ้าคุณใช้มันในเทมเพลตสำหรับการวนซ้ำคุณสามารถทำ {% สำหรับวัตถุใน objects.other_object_set.all%}
Bruce

@stalepretzel ... โดยเฉพาะอย่างยิ่งเมื่อมันเรียกว่า "blocks_SET" - ไม่ใช่ "blocks_relatedmanager" หรือ "blocks_set_relatedmanager"
Klaws

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