我在查询集上的 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 错误

这是我的问题:
我必须为 CollectionElement 建立 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

我发现问题所在。

我的代码,我忘记了模型定义中的括号。 我将括号放在我的模板标签中。

恰恰相反。