2016-08-15 78 views
0

我有我的模型層次定義如下:PK場總是結束在結果查詢GROUP BY子句

class Meal(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    discount_price = models.DecimalField(blank=False, null=False, decimal_places=2, max_digits=4) 
    normal_price = models.DecimalField(blank=True, null=True, decimal_places=2, max_digits=4) 
    available_count = models.IntegerField(blank=False, null=False) 
    name = models.CharField(blank=False, null=False, max_length=255) 
    active = models.BooleanField(blank=False, null=False, default=True) 

class Order(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    number = models.CharField(max_length=64, blank=True, null=True) 
    buyer_phone = models.CharField(max_length=32, blank=False, null=False) 
    buyer_email = models.CharField(max_length=64, blank=False, null=False) 
    pickup_time = models.DateTimeField(blank=False, null=False) 
    taken = models.BooleanField(blank=False, null=False, default=False) 

class OrderItem(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items') 
    meal = models.ForeignKey(Meal, on_delete=models.CASCADE) 
    amount = models.IntegerField(blank=False, null=False, default=1) 

我試圖獲取有關訂單的一些統計數據,我想出了Django的ORM的呼叫,看起來像這樣:

queryset.filter(created_at__range=[date_start, date_end])\ 
     .annotate(price=Sum(F('items__meal__discount_price') * F('items__amount'), output_field=DecimalField())) 
     .annotate(created_at_date=TruncDate('created_at'))\ 
     .annotate(amount=Sum('items__amount'))\ 
     .values('created_at_date', 'price', 'amount') 

以上但不給我預期的結果,因爲某些原因,id柱猶SQL查詢的GROUP BY子句中結束。有什麼幫助嗎?

回答

0

爲了使它工作,我必須做到以下幾點:

qs.filter(created_at__range=[date_start, date_end])\ 
    .annotate(created_at_date=TruncDate('created_at'))\ 
    .values('created_at_date')\ 
    .annotate(price=Sum(F('items__meal__discount_price') * F('items__amount'), 
         output_field=DecimalField())) 
    .annotate(amount=Sum('items__amount')) 

哪一種有意義的 - 我只拉了created_at場,改造它,然後標註與其他兩個字段的結果。