在Django 3.0上,我在一个返回对象列表的Queryset上发现了一个“'ManyRelatedManager'对象不可编辑”错误

2024-09-30 10:40:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django3.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 proprety时,出现以下错误:

TypeError: 'ManyRelatedManager' object is not iterable

我不明白。self.elements.all()返回一个列表作为Queryset,所以它应该是可编辑的,不是吗

当我在python shell中尝试此操作时,效果很好:

c = Collection.objects.all()[0]

total = 0
for element in c.elements.all():
    total += element.total_value
return total  # Works

但当我打电话给proprety时就不是了:

c = Collection.objects.all()[0]
c.total_elements_value  # Throws the error

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

谢谢你的帮助


Tags: selfreturnobjectisvaluemodelselementselement
2条回答

我发现问题出在哪里

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

相反

正如docs中所述,通过在末尾添加_set可以访问实际集(如果您没有手动声明其他内容)。在本例中,使用self.elements_set.all()获取所有不动产对象的查询集

相关问题 更多 >

    热门问题