TypeError: o objeto 'RelatedManager' não é iterável

87

Django

Tenho os próximos 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, o bloco b1 tem o grupo g1 . Por seu nome, quero obter todos os blocos do grupo g1 . Escrevi a próxima função 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

mas b1.group.block_set retorna o objeto RelatedManager , que não é iterável.

O que fazer? O que há de errado?

megido
fonte

Respostas:

180

Experimente isto:

block in group.block_set.all()
Andrey Fedoseev
fonte
9
Alguém sabe por que o RelatedManager não foi feito para ser iterável? Eu esperava que fosse assim ...
stalepretzel
2
Este comentário está um pouco atrasado, mas o raciocínio é que você pode usar os métodos de filtragem no gerenciador para restringir a consulta antes de executar uma busca no banco de dados.
Ovangle
8
@stalepretzel, porque funciona exatamente como um gerenciador django padrão. Você não chama Model.objects e itera sobre ele. Você chama Model.objects.all () e, em seguida, itera. Django manager = / = Django queryset.
Saturnix de
e se você estiver usando em um modelo para loop, você pode fazer {% for object in objects.other_object_set.all%}
Bruce
@stalepretzel ... especialmente porque é chamado de "blocks_SET" - e não um "blocks_relatedmanager". Ou "blocks_set_relatedmanager".
Klaws de
27

Use-o como umManager . Se você quiser todos os objetos, chame o all()método.

Ignacio Vazquez-Abrams
fonte