TypeError: el objeto 'RelatedManager' no es iterable

85

Django

Tengo los siguientes modelos:

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

digamos, el bloque b1 tiene el grupo g1 . Por su nombre quiero obtener todos los bloques del grupo g1 . Escribí la siguiente función recursiva:

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

pero b1.group.block_set me devuelve el objeto RelatedManager , que no es iterable.

¿Qué hacer? ¿Qué pasa?

megido
fuente

Respuestas:

175

Prueba esto:

block in group.block_set.all()
Andrey Fedoseev
fuente
9
¿Alguien sabe por qué RelatedManager no está hecho para ser iterable? Hubiera esperado que fuera así ...
stalepretzel
2
Este comentario llega un poco tarde, pero el razonamiento es que puede usar los métodos de filtrado en el administrador para restringir la consulta antes de realizar una búsqueda en la base de datos.
Ovangle
8
@stalepretzel, porque funciona exactamente como un administrador estándar de Django. No llamas Model.objects y repites sobre él. Llamas Model.objects.all () y luego iteras. Administrador de Django = / = Conjunto de consultas de Django.
Saturnix
y si usted lo está utilizando en una plantilla para el bucle que puede hacer {% para el objeto en objects.other_object_set.all%}
Bruce
@stalepretzel ... especialmente porque se llama "blocks_SET" y no "blocks_relatedmanager". O "blocks_set_relatedmanager".
Klaws
27

Úselo como unManager . Si desea todos los objetos, llame al all()método.

Ignacio Vázquez-Abrams
fuente