我有一个Django应用程序,可以使用基于django聚合查询集的Google Visualization API(Google图表)生成一些图表。 Google Charts API期望数据格式正确,以便正确生成图表(即日期必须是javascript类型Date,而不是整数或浮点数。)
假设我想为我的模型帖子创建一个聚合,以显示特定用户每年的记录总数。我的代码看起来像这样:
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_part()
postgresql函数返回为float,而不是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]
任何人都知道为什么,或者它是否可以修复?
(我当然可以编写一个函数来解决这个问题,然后再将数据传递给我的图库,但我宁愿能够传入查询集(因为那是我写的方式)我的图表lib)。)
答案 0 :(得分:2)
好的,令人尴尬。 只需重新阅读有关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()