2

我一直在尝试使用DateTimeField.

SQL:

SELECT strftime('%H', created_on), count(*)
FROM users_test
GROUP BY strftime('%H', created_on);

此查询工作正常,但相应的 Django 查询不能。

我试过的 Django 查询:

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

它通过“users_test”添加了额外的组。“created_on”,我猜这给出了不正确的结果。

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

环境:

  • 蟒蛇 3
  • Django 1.8.1

提前致谢

参考文献(可能重复)(但没有帮助):

4

1 回答 1

6

要修复它,请附加order_by()到查询链。这将覆盖模型 Meta 默认排序。像这样:

Test
.objects
.extra({'hour': 'strftime("%%H", created_on)'})
.order_by()                                        #<------ here
.values('hour')
.annotate(count=Count('id'))

在我的环境中(Postgres 也是):

>>> 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))

在order_by django 文档中了解更多信息:

如果您不希望将任何排序应用于查询,即使是默认排序也不行,请不带参数调用 order_by()。

旁注:使用可能会在您的代码中extra()引入SQL 注入漏洞。谨慎使用它并转义用户可以引入的任何参数。与文档比较

警告

每次使用 extra() 时都应该非常小心。每次使用时,应将用户可以使用 params 控制的任何参数进行转义,以防止 SQL 注入攻击。请阅读有关SQL 注入保护的更多信息。

于 2015-05-16T07:12:43.017 回答