Pk 字段总是以结果查询 GROUP BY 子句结束

Pk fields always ends up in resulting query GROUP BY clause

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

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 子句中结束。有什么帮助吗?

为了让它工作,我必须执行以下操作:

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 字段,对其进行转换,然后用其他两个字段注释结果。