Pk字段始终以结果查询GROUP BY子句结束

时间:2016-08-15 11:09:37

标签: python sql django django-orm postgresql-9.3

我的模型层次结构定义如下:

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子句中结束。对此有何帮助?

1 个答案:

答案 0 :(得分: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字段,对其进行转换,然后使用其他两个字段对结果进行注释。