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,所以不能投票支持您。但谢谢!你的解决方案也起作用了-因为代表,我不能投票支持你。但是谢谢!