Python 无法迭代多个-如何计算总和?

Python 无法迭代多个-如何计算总和?,python,django,django-models,many-to-many,Python,Django,Django Models,Many To Many,我的模型是这样的: class Article(models.Model): name = models.CharField(max_length=50) description = models.TextField() price = models.FloatField() def __unicode__(self): return "%s - %s" % (self.name, self.price) class Order(models.Model): client = mod

我的模型是这样的:

class Article(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
price = models.FloatField()

def __unicode__(self):
    return "%s - %s" % (self.name, self.price)

class Order(models.Model):
client = models.ForeignKey(User)
articles = models.ManyToManyField(Article)
total = models.FloatField(editable=False, blank=True, default=0)

def __unicode__(self):
    return "%s - %s" % (self.client.username, self.total)

def save(self):
    for a in self.articles:
        self.total += a.price
    super(Order, self).save()
我尝试在save()中计算总价。如果我试图通过管理员保存订单,我会

“Order”实例需要具有主键值,才能使用多对多关系

如果我打电话

super(Order, self).save()
在计算总数之前,我得到

“ManyRelatedManager”对象不可编辑

我不知道该怎么办。。。我想在视图中计算total,但我想将其存储在数据库中

如何迭代订单模型中的所有文章


提前感谢:)

如果您确实需要这样做,您可以先保存实例,如果它没有PK:

def save(self, *args, **kwargs):
    if self.pk is None:
        super(Order, self).save(*args, **kwargs)
    for a in self.articles.all():
        self.total += a.price
    super(Order, self).save(*args, **kwargs)

如果您确实需要这样做,您可以在实例没有PK的情况下首先保存该实例:

def save(self, *args, **kwargs):
    if self.pk is None:
        super(Order, self).save(*args, **kwargs)
    for a in self.articles.all():
        self.total += a.price
    super(Order, self).save(*args, **kwargs)

使用聚合。替换

for a in self.articles:
    self.total += a.price


使用聚合。替换

for a in self.articles:
    self.total += a.price


我将用一个属性替换您的总字段:

class Order():
    ....
    @property
    def total(self):
        return self.articles.aggregate(Sum('price'))['price__sum']

原因是:当您将项目添加到集合中时,不会再次保存对象,因此不会更新计数器。使用此属性,您将确保始终具有正确的数据。

我将用一个属性替换您的total字段:

class Order():
    ....
    @property
    def total(self):
        return self.articles.aggregate(Sum('price'))['price__sum']

原因是:当您将项目添加到集合中时,不会再次保存对象,因此不会更新计数器。使用此属性,您将确保始终拥有正确的数据。

这使我了解到提到的“ManyRelatedManager”对象不可编辑”-我也尝试了此版本。将in-self.articles的
替换为in-self.articles.all()的
ManyRelatedManager的对象确实不可编辑。:-)哦,我忘了
.all()
。现在似乎可以存钱了,但是没有计算出总数。@Daniel Roseman你说“如果你真的需要这样做…”有更好的方法吗?我仍在学习django,因此任何提示都非常感谢:)这让我得到了提到的“ManyRelatedManager”对象不可编辑”-我也尝试了这个版本。将in self.articles的
替换为in self.articles.all()的
ManyRelatedManager的对象确实不可编辑。:-)哦,我忘了
.all()
。现在似乎可以存钱了,但是没有计算出总数。@Daniel Roseman你说“如果你真的需要这样做…”有更好的方法吗?我仍在学习django,因此任何提示都非常感谢:)这样做,django说:
return
行中的
keyrerror:price\u sum
。当你的应用程序有大量的访问者看到这个总数时,你应该研究实现这个值的方法,或者整个视图。感谢你指出这一点,但我认为没有必要缓存total——它最多只在内部被几百个用户使用。为此,django说:
return
行中的
KeyError:price\u sum
。当你的应用程序有大量的访问者看到这个总数时,你应该研究获得这个值的方法,或者整个视图。感谢你指出这一点,但我认为没有必要缓存total—它最多只能在内部由几百名用户使用。您的解决方案也在运行—因为rep,所以不能投票支持您。但谢谢!你的解决方案也起作用了-因为代表,我不能投票支持你。但是谢谢!