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
比如说,块 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 对象,这是不可迭代的。
怎么办?怎么了?
【问题讨论】:
【参考方案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”对象不可迭代的主要内容,如果未能解决你的问题,请参考以下文章
Django:RelatedManager 对象是如何实例化的?