TypeError:“RelatedManager”对象不可迭代

Posted

技术标签:

【中文标题】TypeError:“RelatedManager”对象不可迭代【英文标题】:TypeError: 'RelatedManager' object is not iterable 【发布时间】:2011-09-12 23:28:17 【问题描述】:

姜戈

我有下一个模型:

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

比如说,块 b1g1 组。以它的名字,我想从组 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 对象,这是不可迭代的。

怎么办?怎么了?

【问题讨论】:

【参考方案1】:

试试这个:

block in group.block_set.all()

【讨论】:

有谁知道为什么 RelatedManager 不是可迭代的?我本来希望它是这样的...... 这条评论有点晚了,但原因是您可以使用管理器上的过滤方法来限制查询,然后再执行对数据库的提取。 @stalepretzel,因为它完全可以作为标准的 django 管理器工作。您不会调用 Model.objects 并对其进行迭代。您调用 Model.objects.all() 然后进行迭代。 Django 管理器 =/= Django 查询集。 如果你在模板循环中使用它,你可以做 % for object in objects.other_object_set.all % @stalepretzel ...特别是因为它被称为“blocks_SET” - 而不是“blocks_relatedmanager”。或“blocks_set_relatedmanager”。【参考方案2】:

使用它like a Manager。如果您想要所有对象,请调用all() 方法。

【讨论】:

【参考方案3】:

您必须使用带有相关名称的 .all() 或 childModel_set 模型名称。

在views.py中使用:

for item in object.relatedname.all():
    do something ......

html 模板中使用:

 % for item in object.relatedname.all %
   do something ......
 % endfor %

【讨论】:

以上是关于TypeError:“RelatedManager”对象不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

关联管理器(RelatedManager)

关联管理器(RelatedManager)

Django:RelatedManager 对象是如何实例化的?

Django RelatedManager 的 .create() 用法?

'RelatedManager'对象没有属性'save'

django ORM中的RelatedManager(关联管理器)