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?

Antworten:


175

Versuche dies:

block in group.block_set.all()

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.