TypeError: Das Objekt 'RelatedManager' kann nicht iteriert werden

85

Django

Ich habe nächste Modelle:

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

Angenommen, Block b1 hat die Gruppe g1 . Mit seinem Namen möchte ich alle Blöcke aus der Gruppe g1 erhalten . Ich habe die nächste rekursive Funktion geschrieben:

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

Aber b1.group.block_set gibt mir das RelatedManager- Objekt zurück, das nicht iterierbar ist.

Was ist zu tun? Was ist los?

Megido
quelle

Antworten:

175

Versuche dies:

block in group.block_set.all()
Andrey Fedoseev
quelle
9
Weiß jemand, warum RelatedManager nicht iterierbar ist? Ich hätte erwartet, dass es so ist ...
Stalepretzel
2
Dieser Kommentar ist etwas spät, aber der Grund dafür ist, dass Sie die Filtermethoden auf dem Manager verwenden können, um die Abfrage einzuschränken, bevor Sie einen Abruf an die Datenbank durchführen.
ovangle
8
@stalepretzel, weil es genau wie ein Standard-Django-Manager funktioniert. Sie rufen Model.objects nicht auf und iterieren darüber. Sie rufen Model.objects.all () auf und iterieren dann. Django Manager = / = Django Queryset.
Saturnix
und wenn Sie es in einer Vorlage für Schleife verwenden, können Sie {% für Objekt in objects.other_object_set.all%}
Bruce
@stalepretzel ... vor allem, weil es ein "Blocks_SET" heißt - und kein "Blocks_relatedmanager". Oder "block_set_relatedmanager".
Klaws
27

Verwenden Sie es wie einManager . Wenn Sie alle Objekte möchten, rufen Sie die all()Methode auf.

Ignacio Vazquez-Abrams
quelle