【问题标题】:Django framework list all products and sum all sales for eachDjango 框架列出所有产品并汇总每个产品的所有销售额
【发布时间】:2020-12-13 20:31:30
【问题描述】:

Models.py

class Entity(models.Model):
    entity = models.CharField(max_length=40)

class Period(models.Model):
    period = models.CharField(max_length=10)

class Product(models.Model):
    entity = models.ForeignKey(Entity, on_delete=models.CASCADE, default=None, blank=True, null=True)
    period = models.ForeignKey(Period, on_delete=models.CASCADE, default=None, blank=True, null=True)
    sku = models.CharField(max_length=12)

class Sale(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, default=None, blank=True, null=True)
    price = models.DecimalField(max_digits=11, decimal_places=2)

Views.py

if request.method == 'POST':
            if form.is_valid():
                entityquery = form.cleaned_data['entity']
                periodquery = form.cleaned_data['period']
                entities = Entity.objects.get(entity=entityquery)
                periods = Period.objects.get(period=periodquery)
                products = Product.objects.filter(entity=entityquery, period=periodquery).values('id', 'period', 'entity', 'sku')
                for sales in products.iterator():
                    sales = Sale.objects.filter(product__sku=product.sku, product__entity=entityquery, product__period=periodquery).aggregate(Sum('price'))
                return sales
            args = {'form': form, 'products': products, 'periods': periods, 'entities': entities, 'sales': sales}
        return render(request, "products_list.html", args)

预期结果

到目前为止,我能够根据标准(期间和实体)列出所有已售出的 SKU 商品。假设 SKU 12 有两个销售额 10 美元和 30 美元,SKU 23 有三个销售额 5 美元、5 美元和 6 美元 我需要显示每种产品的总销售额。

输入

Entity: Company XZY 
Period: November

输出

SKU  Total Sales
12   40.00
23   16.00

【问题讨论】:

标签: django django-models django-views django-forms django-templates


【解决方案1】:

可以使用 django ORM 执行 group bySUM

How to query as GROUP BY in django?

from django.db.models import Sum

sales = Sale.objects.filter(product__sku=product.sku, product__entity=entityquery, product__period=periodquery).values(`product`).annotate(total = Sum('price'))

此外,在大多数情况下,循环查询的效率非常低。 如果可能,请尝试使用内置的 ORM 方法来避免这种情况。 这称为 N+1 查询问题。

【讨论】:

  • 谢谢!!!我正在尝试内置 ORM 并且在 annotate() 之前缺少 .values() 并且无法使其工作,这就是我尝试 for 循环的原因。
  • 有很多 sku 这不起作用:( product__sku=product.sku
  • 得到以下错误:不能使用多字段值作为过滤值。
  • 在这种情况下,您可以尝试使用 sku 列表进行过滤吗?
  • 过滤器(product__sku_in=sku_list)?
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
相关资源
最近更新 更多