【问题标题】:TypeError: 'RelatedManager' object is not iterableTypeError:“RelatedManager”对象不可迭代
【发布时间】: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 对象,这是不可迭代的。

怎么办?怎么了?

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案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 %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 2013-09-01
        • 2017-08-27
        • 2018-10-10
        • 2021-12-13
        • 2019-02-20
        • 2020-03-27
        相关资源
        最近更新 更多