【问题标题】:How to get the sum of the prices of all items in the Magazine? - django ORM如何获得杂志中所有物品的价格总和? - django ORM
【发布时间】:2012-09-28 09:52:50
【问题描述】:
class Item(models.Model):
    name = models.CharField(max_length=50)
    item_price = models.DecimalField(max_digits=5, decimal_places=2)

class Magazine(models.Model):
    name = models.CharField(max_length=50)
    items = models.ManyToManyField('Item', blank=True, null=True)
    owner = models.ForeignKey(User, related_name='u_item')

如何获得杂志中所有物品的价格总和?

在视图中:

...
    user = request.user
    magazins = Magazine.objects.filter(owner= user)
...

【问题讨论】:

  • 欢迎来到 SO!您想要每本杂志的总价格吗?为什么不直接遍历项目并添加价格?也许如果您能更具体地说明问题出在哪里,我们可以提供更好的帮助。
  • 欢迎您!我不能参考 item_price。在多对多关系中
  • for item in self.itemsMagazine 函数中?
  • 我需要更详细的解释:(

标签: python django django-models django-orm


【解决方案1】:

首先查看aggregations in Django

它可能如下所示:

from django.db.models import Sum
owners_magazines = Magazine.objects.filter(owner='Your owner')
total = 0;
for magazine in owners_magazines:
    item_values_with_total = magazine.items.values().annotate(total=Sum('item_price'))
    total += <Read appropriately from item_values_with_total>

您可以使用进一步尝试将事物组合在一起。返回的值将包含一个名为 total 的字段,其中包含所需的总和。

编辑 -

您可以尝试非 ORM 解决方案以更好地理解它

from django.db.models import Sum
    owners_magazines = Magazine.objects.filter(owner='Your owner')
    total = 0;
    for magazine in owners_magazines:
        all_items = magazines.items_set.all()
        for item in all_items:
            total += item.item_price

    print total

【讨论】:

  • 此代码在 manage.py shell 中返回此错误:name 'items' is not defined
  • 尝试itemItem 而不是items,因为您已经明确说明了这一点。
  • 我添加了 'items' Magazine.objects.filter(owner=user).values('items').annotate(total=Sum('item_price')) 但返回错误:FieldError: Cannot resolve关键字“item_price”进入字段。选项有:id、name、owner、items - 但这是多对多关系
  • MultipleObjectsReturned: get() 返回了多个杂志——它返回了 2 个!查找参数为 {'owner': 1}
  • 尝试从该所有者的杂志中删除一个条目,以便只返回一个结果。如果它适用于那个,可以让它在以后适用于多个。
【解决方案2】:

使用aggregation:

from django.db.models import Sum

for m in Magazine.objects.all():
   total = m.items_set.all().annotate(total=Sum('item_price'))
   print 'Total cost for items in {0} is {1}'.format(m,total)

【讨论】:

  • 'total' 返回 [],而不是本杂志中所有项目的价格。打印输出:user_magazin 中项目的总成本为 []
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
相关资源
最近更新 更多