TypeError: l'oggetto "RelatedManager" non è iterabile


87

Django

Ho i prossimi modelli:

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

diciamo, il blocco b1 ha il gruppo g1 . Con il suo nome voglio ottenere tutti i blocchi dal gruppo g1 . Ho scritto la prossima funzione ricorsiva:

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

ma b1.group.block_set mi restituisce l' oggetto RelatedManager , che non è iterabile.

Cosa fare? Cosa c'è che non va?

Risposte:


180

Prova questo:

block in group.block_set.all()

9
Qualcuno sa perché RelatedManager non è fatto per essere iterabile? Mi sarei aspettato che fosse così ...
stalepretzel

2
Questo commento è un po 'in ritardo, ma il ragionamento è che puoi usare i metodi di filtraggio sul gestore per limitare la query prima di eseguire un fetch nel db.
ovangle

8
@stalepretzel, perché funziona esattamente come un manager django standard. Non si chiama Model.objects e si ripete su di esso. Chiami Model.objects.all () e poi iterate. Django manager = / = Django queryset.
Saturnix

e se lo stai usando in un template for loop puoi fare {% for object in objects.other_object_set.all%}
Bruce

@stalepretzel ... soprattutto perché si chiama "blocks_SET" - e non "blocks_relatedmanager". Oppure "blocks_set_relatedmanager".
Klaws

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.