TypeError:'RelatedManager'对象不可迭代

meg*_*ido 67 python django django-models django-queryset

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
Run Code Online (Sandbox Code Playgroud)

比方说,块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
Run Code Online (Sandbox Code Playgroud)

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

该怎么办?怎么了?

And*_*eev 144

试试这个:

block in group.block_set.all()
Run Code Online (Sandbox Code Playgroud)

  • 有谁知道为什么RelatedManager不能被迭代?我原以为它会这样...... (7认同)
  • @stalepretzel,因为它完全像标准的django管理器一样工作.你不要调用Model.objects并迭代它.你调用Model.objects.all()然后迭代.Django manager =/= Django queryset. (7认同)
  • 这条评论有点晚了,但原因是您可以在管理器上使用过滤方法,以便在对数据库执行提取之前限制查询。 (2认同)

Ign*_*ams 24

Manager一样使用它.如果您想要所有对象,则调用该all()方法.


K.A*_*K.A 17

您必须将 .all() 与相关名称或 childModel_set 模型名称 一起使用。

在views.py中使用:

for item in object.relatedname.all():
    do something ......
Run Code Online (Sandbox Code Playgroud)

在 html 模板中使用:

 {% for item in object.relatedname.all %}
   do something ......
 {% endfor %}
Run Code Online (Sandbox Code Playgroud)