猿问

我在返回对象列表的查询集上的 Django 3.0 上收到“‘ManyRelatedManager’

TypeError: 'ManyRelatedManager' object is not iterable我在 Django 3.0 中遇到错误


这是我的问题:

我必须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' 对象不可迭代


我不明白。self.elements.all() 返回一个列表作为查询集,所以它应该是可迭代的,不是吗?


当我在 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

我想知道如何解决这个问题,但更重要的是,了解为什么这不起作用。


感谢您的帮助。


慕娘9325324
浏览 174回答 2
2回答

千万里不及你

我发现是问题所在。我的代码,我忘记了模型定义中的括号。我将括号放在我的模板标签中。恰恰相反。

收到一只叮咚

正如文档中所述,可以通过_set在末尾添加来访问实际的集合(如果您没有手动声明)。在您的情况下,获取所有相关对象的 QuerySetself.elements_set.all()
随时随地看视频慕课网APP

相关分类

Python
我要回答