【问题标题】:Django ORM Query or raw SQL QueryDjango ORM 查询或原始 SQL 查询
【发布时间】:2018-05-15 05:17:08
【问题描述】:

我需要查询,可以显示客户订购的衣服总数,结果应该是这样的:

客户_1 | Cloth_Type_X_SUM | Cloth_Type_Y_SUM | Cloth_Type_Z_SUM | SUM_ALL 客户_2 | Cloth_Type_X_SUM | Cloth_Type_Y_SUM | Cloth_Type_Z_SUM | SUM_ALL 客户_3 | Cloth_Type_X_SUM | Cloth_Type_Y_SUM | Cloth_Type_Z_SUM | SUM_ALL

models.py

class Cloth(models.Model):
    description = models.CharField(max_length=30)
    type = models.CharField(max_length=2)

class Order(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True)

class Order_Detail(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    cloth = models.ForeignKey(Cloth, on_delete=models.CASCADE)
    weight = models.FloatField()

我得到的最接近的是:

Order_Detail.objects.values('order__client__name','cloth__type').annotate(Sum('weight'))

这样做的问题是它会为每种布料类型检索一个对象:

Client_1 | Cloth_Type_X | SUM_X
Client_1 | Cloth_Type_Y | SUM_Y
Client_1 | Cloth_Type_Z | SUM_Z
Client_2 | Cloth_Type_X | SUM_X
Client_2 | Cloth_Type_Y | SUM_Y
Client_2 | Cloth_Type_Z | SUM_Z
Client_3 | Cloth_Type_X | SUM_X
Client_3 | Cloth_Type_Y | SUM_Y
Client_3 | Cloth_Type_Z | SUM_Z

没有更好的方法吗?

【问题讨论】:

  • 您是否要按客户获取体重组?
  • 是的,但不仅是总重量,还有每种布料类型的重量总和。

标签: sql django django-models subquery django-queryset


【解决方案1】:

您可以为此目的使用Conditional Expressions

Order_Detail.objects.values('order__client').annotate(
   cloth_type_x_sum = Sum(Case(When(cloth__type=X, then='weight'))), 
   cloth_type_y_sum = Sum(Case(When(cloth__type=Y, then='weight'))),
   cloth_type_z_sum = Sum(Case(When(cloth__type=Z, then='weight'))),
).order_by('order__client')

【讨论】:

  • 太好了,这正是我需要的!谢谢兄弟!
【解决方案2】:
from django.db.models import Sum
Order_Detail.objects.values('cloth').annotate(cloth_weight=Sum('weight'))

这会给你按布料类型分组。

Order_Detail.objects.values('order__client').annotate(cloth_weight=Sum('weight'))

这会给你按客户分组。

【讨论】:

  • 是的,但是在不同的对象值中,我需要将它放在同一个对象结果中。结果应该是这样的:client_1 |布料类型 x 总和 |布料类型_Y_sum | Cloth_type_z_sum | sum_total
猜你喜欢
  • 2019-08-05
  • 2022-08-18
  • 2019-06-11
  • 2021-09-23
  • 1970-01-01
  • 2015-11-21
  • 2012-03-16
  • 2012-08-03
  • 2017-04-03
相关资源
最近更新 更多