我在查询集上的 Django 3.0 上遇到了“'ManyRelatedManager' 对象不可迭代”错误,那是 returns 对象列表
I got a "'ManyRelatedManager' object is not iterable" error on Django 3.0 on a Queryset thats returns a list of objects
我遇到了 Django 3.0 中的 TypeError: 'ManyRelatedManager' object is not iterable
错误
这是我的问题:
我必须为 Collection
和 Element
建立 ManyToMany
关系模型。
以下是模型(我明显省略了所有与问题无关的其他属性和方法):
class Collection(models.Models):
elements = models.ManyToManyField(Element, related_name="collections")
@proprety
def total_elements_value(self):
total = 0
for element in self.elements.all(): # The problem is on this line !
total += element.total_value
return total
class Element(models.Models):
value1 = models.IntegerField()
value2 = models.IntegerField()
@proprety
def total_value(self):
return self.value1 + self.value2
但是当我尝试调用 Collection.total_elements_value 属性时,出现了这个错误:
TypeError: 'ManyRelatedManager' object is not iterable
我不明白。 self.elements.all() return 列表作为查询集,所以它应该是可迭代的,不是吗?
当我在 python shell 中尝试这个时,效果很好:
c = Collection.objects.all()[0]
total = 0
for element in c.elements.all():
total += element.total_value
return total # Works
但是当我打电话给酒店时不是:
c = Collection.objects.all()[0]
c.total_elements_value # Throws the error
我想知道如何解决这个问题,但更重要的是,了解为什么这不起作用。
感谢您的帮助。
如 docs 中所述,可以通过在末尾添加 _set
来访问实际集合(如果您没有手动声明)。在您的情况下,使用 self.elements_set.all()
获取所有相关对象的 QuerySet
我发现问题所在。
我的代码,我忘记了模型定义中的括号。
我将括号放在我的模板标签中。
恰恰相反。
我遇到了 Django 3.0 中的 TypeError: 'ManyRelatedManager' object is not iterable
错误
这是我的问题:
我必须为 Collection
和 Element
建立 ManyToMany
关系模型。
以下是模型(我明显省略了所有与问题无关的其他属性和方法):
class Collection(models.Models):
elements = models.ManyToManyField(Element, related_name="collections")
@proprety
def total_elements_value(self):
total = 0
for element in self.elements.all(): # The problem is on this line !
total += element.total_value
return total
class Element(models.Models):
value1 = models.IntegerField()
value2 = models.IntegerField()
@proprety
def total_value(self):
return self.value1 + self.value2
但是当我尝试调用 Collection.total_elements_value 属性时,出现了这个错误:
TypeError: 'ManyRelatedManager' object is not iterable
我不明白。 self.elements.all() return 列表作为查询集,所以它应该是可迭代的,不是吗?
当我在 python shell 中尝试这个时,效果很好:
c = Collection.objects.all()[0]
total = 0
for element in c.elements.all():
total += element.total_value
return total # Works
但是当我打电话给酒店时不是:
c = Collection.objects.all()[0]
c.total_elements_value # Throws the error
我想知道如何解决这个问题,但更重要的是,了解为什么这不起作用。
感谢您的帮助。
如 docs 中所述,可以通过在末尾添加 _set
来访问实际集合(如果您没有手动声明)。在您的情况下,使用 self.elements_set.all()
我发现问题所在。
我的代码,我忘记了模型定义中的括号。 我将括号放在我的模板标签中。
恰恰相反。