TypeError:“ RelatedManager”对象不可迭代


85

Django的

我有下一个型号:

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

例如,块b1具有g1组。用它的名字,我想从组g1中获取所有块。我写了下一个递归函数:

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

但是b1.group.block_set返回我的RelatedManager对象,这是不可迭代的。

该怎么办?怎么了?

Answers:


175

试试这个:

block in group.block_set.all()

9
有谁知道为什么RelatedManager不可迭代?我本来希望是那样...
stalepretzel

2
该注释有些晚,但是原因是您可以在管理器上使用过滤方法,以便在执行对数据库的访存之前限制查询。
ovangle

8
@stalepretzel,因为它与标准django管理器完全一样。您不调用Model.objects并对其进行迭代。您调用Model.objects.all(),然后进行迭代。Django manager = / = Django queryset。
Saturnix

如果您在循环模板中使用它,则可以{{对objects.other_object_set.all%中的对象使用%}
Bruce

@stalepretzel ...尤其是因为它被称为“ blocks_SET”,而不是“ blocks_relatedmanager”。或“ blocks_set_relatedmanager”。
劳斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.