2017-12-01 11 views
0

は、私はクライアントが注文した服の総量を表示することができますクエリを、確認する必要があり、その結果は次のようにする必要があります:DjangoのORMクエリまたは生のSQLクエリ

Client_1 | Cloth_Type_X_SUM | Cloth_Type_Y_SUM | Cloth_Type_Z_SUM | SUM_ALL Client_2 | Cloth_Type_X_SUM | Cloth_Type_Y_SUM | Cloth_Type_Z_SUM | SUM_ALL Client_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 

良いアプローチはありませんか?

+0

あなたがクライアントによって重量・グループを取得しようとしているその目的のためにConditional Expressionsを使用することができますか? –

+0

はい、合計重量だけでなく、各布タイプの重量の合計です。 – victim

答えて

1

あなたは

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') 
+1

優秀、これは私が必要としていたものです!ありがとう兄貴! – victim

0
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')) 

これは、クライアントごとにグループ化されます。

+0

はい、しかし異なるオブジェクト値では、私は同じオブジェクトの結果でそれを持つ必要があります。結果は次のようになります。 client_1 | cloth_type_x_sum | cloth_type_Y_sum | cloth_type_z_sum | sum_total – victim