2

Django 集計クエリセットに基づいて、Google Visualization API (Google チャート) を使用していくつかのグラフを生成する Django アプリケーションがあります。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()

date_part()これは、timestampz フィールドから年を抽出するために使用される postgresql 関数が int ではなく float として返されることを除いて、非常にうまく機能します。

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 に答える