Python psycopg2返回错误的(?)日期\部件函数类型

Python psycopg2返回错误的(?)日期\部件函数类型,python,django,psycopg2,Python,Django,Psycopg2,我有一个Django应用程序,它使用基于Django聚合查询集的Google可视化API(Google图表)生成一些图形。GoogleCharts API希望数据的格式正确,以正确绘制并生成图形(即日期必须是javascript类型的日期,而不是整数或浮点) 假设我想为我的模型帖子创建一个聚合,以显示特定用户每年的记录总数。我的代码如下所示: qset = Post.objects.filter(user__id=1).extra(select={"year": "date_part('year

我有一个Django应用程序,它使用基于Django聚合查询集的Google可视化API(Google图表)生成一些图形。GoogleCharts API希望数据的格式正确,以正确绘制并生成图形(即日期必须是javascript类型的日期,而不是整数或浮点)

假设我想为我的模型帖子创建一个聚合,以显示特定用户每年的记录总数。我的代码如下所示:

qset = Post.objects.filter(user__id=1).extra(select={"year": "date_part('year', cdt)"}\
          .values("year").annotate(num_records=Count("id")).order_by()
这项工作非常好,除了用于从timestampz字段提取年份的
date\u part()

从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]
导入psycopg2
def main():
conn_string=“host='localhost'dbname='mydb'user='username'password='secret'”
conn=psycopg2.connect(连接字符串)
游标=连接游标()
sql=“从public.core_post(其中id=6543)中选择日期部分('year',cdt;”
cursor.execute(sql)
对于cursor.fetchone()中的rec:
打印类型(rec),rec
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
2011
[在0.1s内完成]
有人知道原因吗,或者可以修复吗

(在将数据传递到图形库之前,我当然可以编写一个函数来解决这个问题,但我更希望能够传递查询集(因为这就是我编写图形库的方式)。

好吧,很尴尬。 只需重新阅读有关date_部分的PostgreSQL文档,其中明确指出:

Function                    Return Type
date_part(text, interval)   double precision
我接受这个答案,留作将来参考

通过将
date\u 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()