DJANGO - 按类别小计和按项目总计

Posted

技术标签:

【中文标题】DJANGO - 按类别小计和按项目总计【英文标题】:DJANGO - Subtotal by category and total by item 【发布时间】:2020-04-08 22:03:40 【问题描述】:

晚上好!

假设我有一个数据库:

Category | Item | Price
Cat1 | Item1 | $1
Cat1 | Item2 | $2
Cat2 | Item3 | $3
Cat2 | Item3 | $3
Cat2 | Item4 | $4

我想按类别显示总销售额,并在按项目分组的销售详细信息下方显示

Cat1 - Total Price = $3
  Item1 - $1
  Item2 - $2
Cat2 - Total Price = $10
  Item3 - $6 (the sum of the two item3)
  Item4 - $4

我几乎成功了,但我不知道如何按类别进行小计。 我的代码如下:

模型.py

class Category(models.Model):
Category= models.CharField(max_length=100)

class Item(models.Model):
Category= models.ForeignKey(Category, on_delete=models.CASCADE)
Item= models.CharField(max_length=100)

class Order(models.Model):
Category= models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
Item=  models.ForeignKey(Item, on_delete=models.SET_NULL, null=True)
Price=  models.DecimalField()

Views.py

def summary(request):
metrics =  
'total': Sum('Price'),


orders=Order.objects.values('Category','Item').annotate(**metrics))

模板.html

 % for order in orders%
       % ifchanged order.Item%

       <tr>
           <td> order.Item </td>
           <td>order.total </td>
        </tr>

       % endifchanged %
        <tr>
        <td>order.Item</td>
        <td> order.total</td>
        </tr>


    % endfor %

【问题讨论】:

【参考方案1】:

您可以使用Prefetch(..) object [Django-doc] 来根据CategoryItem 进行聚合:

from django.db.models import Prefetch, Sum

def summary(request):
    categories = Category.objects.annotate(
        total=Sum('item__order__Price')
    ).prefetch_related(
        Prefetch(
            'item_set',
            Item.objects.annotate(total=Sum('order__Price')),
            to_attr='items_with_price'
        )
    )
    return render(request, 'template.html', 'categories': categories)

在模板中,然后可以使用:

% for category in categories %
    <tr>
        <td><b> category.Category </b></td>
        <td><b> category.total </b></td>
    </tr>
    % for item in category.items_with_price %
        <tr>
            <td> item.Item </td>
            <td> item.total </td>
        </tr>
    % endfor %
% endfor %

【讨论】:

谢谢!但我有一个错误。我错过了什么吗? 无法将关键字“价格”解析为字段。选项有:Category、Category_id、Item、id、order @MichaelS:您能否在复制错误时编辑问题?现在,如果没有任何有关错误的信息,很难(非常)调试。 @MichaelS:这确实是一个错字,应该是Sum('order__Price') 而不是Sum('Price')

以上是关于DJANGO - 按类别小计和按项目总计的主要内容,如果未能解决你的问题,请参考以下文章

计算所有项目总计到小计 Jquery

rails方法来计算小计和总计

结帐 magento 1.5 中的小计和总计加倍

如何处理组小计,例如WPF DataGrid 中的目标行?

向我的数据框添加按类别小计的行

按 R 组小计