2

我有一个 Django 应用程序,它使用基于 django 聚合查询集的 Google Visualization API(Google 图表)生成一些图形。Google Charts API 期望数据格式正确,以正确绘制生成图表(即日期需要是 javascript 类型的 Date,而不是整数或浮点数)。

假设我想为我的模型 Posts 创建一个聚合,以显示特定用户每年的记录总数。我的代码看起来像这样:

qset = Post.objects.filter(user__id=1).extra(select={"year": "date_part('year', cdt)"}\
          .values("year").annotate(num_records=Count("id")).order_by()

这项工作非常好,除了date_part()用于从 timestampz 字段中提取年份的 postgresql 函数返回为浮点数,而不是 int,以防弄乱我的图表数据。

从 psql 运行类似的查询会返回一个整数,这是我所期望的。

select date_part('year', cdt) from public.core_post where id=6543;
  date_part 
  -----------
  2011
(1 row)

同样,使用 psycopg2 库运行一个小型 python 程序给了我同样的问题:

import psycopg2

def main():
    conn_string = "host='localhost' dbname='mydb' user='username' password='secret'"
    conn = psycopg2.connect(conn_string)
    cursor = conn.cursor()

    sql = "select date_part('year', cdt) from public.core_post where id=6543;"
    cursor.execute(sql)

    for rec in cursor.fetchone():
        print type(rec), rec

if __name__ == '__main__':
    main()

<type 'float'> 2011.0
[Finished in 0.1s]

任何人都知道为什么,或者它是否可以修复?

(我当然可以在将数据传递到我的图形库之前编写一个修复此问题的函数,但我宁愿能够传入查询集(因为这就是我编写图形库的方式)。)

4

1 回答 1

3

好吧,尴尬。只需重新阅读有关 date_part 的 PostgreSQL 文档,其中清楚地说:

Function                    Return Type
date_part(text, interval)   double precision

我会接受这个作为答案,并将其留作将来参考。

通过将结果转换date_part()为 int 来解决。

qset = Post.objects.filter(user__id=1).extra(
           select={"year": "date_part('year', cdt)::int"}) \
           .values("year").annotate(num_records=Count("id")).order_by()
于 2012-12-20T09:21:10.640 回答