9

発行日 (pub_date) を取得するために DateTimeField(auto_now_add=True) を持つ記事のようなモデルを使用しています。これは次のようになります。

class Article(models.Model):
    text = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

1 日に追加された記事の投稿またはエントリの数をカウントするクエリを実行したいと考えています。つまり、エントリをクエリして、日ごと (最終的には月、時間、秒など) にグループ化したいと考えています。これは、SQLite シェルでは次のようになります。

select pub_date, count(id) from "myapp_article"
where id = 1
group by strftime("%d", pub_date)
;

次のようなものを返します。

2012-03-07 18:08:57.456761|5
2012-03-08 18:08:57.456761|9
2012-03-09 18:08:57.456761|1

Django QuerySet からその結果を取得する方法がわかりません。itertools.groupby を使用して同様の結果を得る方法を認識していますが、この状況ではそれは不可能です (説明は後述)。

このクエリの最終結果は、1 日あたりの投稿数を示すグラフで使用されます。この目標を達成するためにDjango Chartitパッケージを使用しようとしています。Chartit は、データ ソース (DataPool) に制約を課します。ソースは Model、Manager、または QuerySet である必要があるため、私が知る限り、itertools.groupby を使用することはオプションではありません。

問題は... どうすればエントリを日ごとにグループ化または集約し、最終的に QuerySet オブジェクトになるのでしょうか?

4

1 に答える 1

31

日付データのみ (時間ではなく) を格納し、Count で注釈を付ける追加のフィールドを作成します。

Article.objects.extra({'published':"date(pub_date)"}).values('published').annotate(count=Count('id'))

結果は次のようになります。

published,count
2012-03-07,5
2012-03-08,9
2012-03-09,1
于 2012-05-23T20:20:18.883 に答える