【问题标题】:Django adds an extra field to the GROUP BY clauseDjango 在 GROUP BY 子句中添加了一个额外的字段
【发布时间】:2018-05-19 16:32:48
【问题描述】:

这是一个查询:

speed_by_computer = ChartPoint.objects.filter(
    date__gte=start,
    date__lt=end,
).values('computer_id') \
 .annotate(max_speed=Max('speed'))

这是由该查询生成的 SQL 查询:

SELECT "computer_id", MAX("speed") AS "max_speed" 
FROM "api_chartpoint" 
WHERE (
    "date" >= 2018-05-17 08:00:00+00:00 AND 
    "date" < 2018-05-17 09:00:00+00:00
) 
GROUP BY "computer_id", "date" 
ORDER BY "date" DESC

请注意,GROUP BY 子句中有一个意外的date。为什么会在这里?这是我的预期:

SELECT "computer_id", MAX("speed") AS "max_speed" 
FROM "api_chartpoint" 
WHERE (
    "date" >= 2018-05-17 08:00:00+00:00 AND
    "date" < 2018-05-17 09:00:00+00:00
) 
GROUP BY "computer_id"

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    问题在于默认顺序。在Meta中指定:

    class ChartPoint(models.Model)
        ...
        class Meta:
           ordering = ['-date']
    

    删除排序,date 将不会添加到GROUP BY

    speed_by_computer = ChartPoint.objects.filter(
        date__gte=start,
        date__lt=end,
    ).values('computer_id') \
     .annotate(hs_avg=Max('speed'))
     .order_by()
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2013-01-21
      • 2021-10-28
      • 2011-08-27
      • 2011-06-25
      • 2013-08-29
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多