使用Django每小时对行进行分组

使用Django每小时对行进行分组,django,postgresql,django-1.8,Django,Postgresql,Django 1.8,我一直在尝试使用DateTimeField将表的结果按小时格式分组 SQL: 此查询工作正常,但相应的Django查询不工作 我尝试过的Django查询: 它通过“users\u test”添加了额外的组。“created\u on”,我猜这会给出错误的结果。 如果有人能向我解释这一点并提供解决方案,那就太好了 环境: Python 3 Django 1.8.1 提前谢谢 参考资料(可能重复)(但无帮助): 若要修复它,请在查询链中附加order\u by()。这将覆盖模型元默认顺序

我一直在尝试使用
DateTimeField
将表的结果按小时格式分组

SQL: 此查询工作正常,但相应的Django查询不工作

我尝试过的Django查询: 它通过“users\u test”添加了额外的组。“created\u on”,我猜这会给出错误的结果。

如果有人能向我解释这一点并提供解决方案,那就太好了

环境:
  • Python 3
  • Django 1.8.1
提前谢谢

参考资料(可能重复)(但无帮助):

若要修复它,请在查询链中附加
order\u by()
。这将覆盖模型元默认顺序。像这样:

Test
.objects
.extra({'hour': 'strftime("%%H", created_on)'})
.order_by()                                        #<------ here
.values('hour')
.annotate(count=Count('id'))
了解更多信息,请访问:

如果不希望对查询应用任何排序,甚至不希望对默认排序应用任何排序,请调用order_by(),不带参数

旁注: 使用
extra()。谨慎使用此选项,并避开用户可能引入的任何参数:

警告

无论何时使用extra(),都应该非常小心。每次你 使用它,您应该转义用户可以控制的任何参数 使用参数以防止SQL注入攻击。 请阅读更多关于


这个答案很古老,但您有引入SQL注入的风险。在这个特定的例子中可能不是这样,但请注意,这可能很棘手
无论何时使用extra(),都应该非常小心。每次使用它时,都应该转义用户可以通过使用参数控制的任何参数,以防止SQL注入攻击。
Hi@gonczor,好球。你有>2k的吗。你能编辑答案吗?完成了。很高兴我能帮忙:)谢谢你这么做。
Test.objects.extra({'hour': 'strftime("%%H", created_on)'}).values('hour').annotate(count=Count('id'))
# SELECT (strftime("%H", created_on)) AS "hour", COUNT("users_test"."id") AS "count" FROM "users_test" GROUP BY (strftime("%H", created_on)), "users_test"."created_on" ORDER BY "users_test"."created_on" DESC
Test
.objects
.extra({'hour': 'strftime("%%H", created_on)'})
.order_by()                                        #<------ here
.values('hour')
.annotate(count=Count('id'))
>>> print ( Material
         .objects
         .extra({'hour': 'strftime("%%H", data_creacio)'})
         .order_by()
         .values('hour')
         .annotate(count=Count('id'))
         .query )

  SELECT (strftime("%H", data_creacio)) AS "hour", 
         COUNT("material_material"."id") AS "count" 
    FROM "material_material" 
GROUP BY (strftime("%H", data_creacio))