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
このコメントは少し遅れていますが、その理由は、データベースへのフェッチを実行する前にクエリを制限するために、マネージャでフィルタリングメソッドを使用できるためです。
ovangle 2015年

8
@stalepretzelは、標準のdjangoマネージャーとまったく同じように機能するためです。Model.objectsを呼び出して、それを繰り返すことはありません。Model.objects.all()を呼び出してから、繰り返します。Djangoマネージャー= / = Djangoクエリセット。
Saturnix 2015年

テンプレートのforループで使用している場合は、{%for object in 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.