【问题标题】:django queryset with __date returns Nones带有 __date 的 Django 查询集返回无
【发布时间】:2022-01-05 23:25:03
【问题描述】:

我有一个 django 查询集,我想按 created_at 日期值分组(created_at 是一个日期时间字段)。

(Activity.objects
    .values('created_at__date')
    .annotate(count=Count('id'))
    .values('created_at__date', 'count')
 )

我正在关注已接受的答案here,这是有道理的。但是,查询为所有 created_at__date 值返回 None。当我将其更改为 created_at 时,它会显示实际值。

生成的 SQL 查询:

SELECT 
   django_datetime_cast_date("activity"."created_at", 'UTC', 'UTC'), 
   COUNT("activity"."id") AS "count" 
FROM 
   "activity" 
GROUP BY 
   django_datetime_cast_date("activity"."created_at", 'UTC', 'UTC')

我正在使用本地 sqlite3 数据库,数据库中的一些示例记录(表中的其他列已删除):

2,2021-07-30T11:44:09.984439+00:00
3,2021-07-30T11:44:29.217916+00:00
4,2021-07-30T11:44:43.598702+00:00
5,2021-08-03T20:53:48.482419+00:00
6,2021-08-04T22:19:52.810907+00:00
7,2021-08-05T17:25:29.646553+00:00
8,2021-08-05T17:25:33.425523+00:00
9,2021-08-05T17:26:22.169369+00:00
10,2021-08-05T17:50:26.585485+00:00
11,2021-08-10T16:20:38.839126+00:00
12,2021-08-10T17:38:00.557487+00:00
13,2021-08-11T16:09:30.470890+00:00
14,2021-08-11T16:09:34.164904+00:00
15,2021-08-12T15:43:18.819458+00:00
16,2021-08-12T16:19:30.123575+00:00
18,2021-08-15T12:55:20.660137+00:00
24,2021-08-18T18:21:12.153480+00:00
25,2021-08-18T19:18:37.432911+00:00

【问题讨论】:

  • 这是 MySQL 数据库吗?
  • 它是 sqlite3 DB,也会添加到问题中
  • 你的代码没问题。它按预期工作。可以共享您数据库中的示例记录吗?
  • 添加样本数据
  • 我明白了..错误是表中的数据是从postgres迁移而来的,sqlite无法从这种格式中获取日期,因为它期望2021-11-29 12:40:19.105073格式。

标签: django django-queryset


【解决方案1】:

原因是 sqlite3 数据库无法存储时区信息,因为它不支持内置日期和/或时间。由于示例日期包含时区信息,sqlite3 无法从 datetime 字段中提取日期,并显示为 None。

sqlite3 的正确格式

2021-11-29 12:40:20.021350

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多