2011-06-11 11 views
40

DjangoTypeError: objeto 'RelatedManager' no se Iterable

tengo 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 

decir, bloquear b1 tiene G1 grupo. Por su nombre quiero obtener todos los bloques del grupo g1. Escribí 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 vuelve RelatedManager objeto, que no es iterable.

¿Qué hacer? ¿Qué pasa?

Respuesta

98

Prueba esto:

block in group.block_set.all() 
+4

¿Alguien sabe por qué RelatedManager no está hecho para ser iterable? Hubiera esperado que fuera de esa manera ... – stalepretzel

+0

Este comentario es 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 al db. – ovangle

+5

@stalepretzel, porque funciona exactamente como un administrador de django estándar. No llama a Model.objects e itera sobre él. Llamas a Model.objects.all() y luego iteras. Django manager =/= Django queryset. – Saturnix

18

Utilícelo like a Manager. Si desea todos los objetos, llame al método all().

Cuestiones relacionadas