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?

Respuestas:


175

Prueba esto:

block in group.block_set.all()

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.