1. ホーム
  2. django

[解決済み] Django: 日付によるグループ化 (日、月、年)

2022-11-19 21:17:14

質問

このようなシンプルなモデルを持っています。

class Order(models.Model):
    created = model.DateTimeField(auto_now_add=True)
    total = models.IntegerField() # monetary value

そして、月別の内訳を出力したい。

  • 1ヶ月の売上高( COUNT )
  • 結合された値( SUM )

この問題を解決する最良の方法は何なのかわかりません。かなり恐ろしい外観の追加選択クエリをいくつか見ましたが、私の単純な考えでは、任意の開始年/月から開始して、現在の月に到達するまでカウントアップし、その月についてフィルタリングする単純なクエリを投げて、数字を反復する方がよいかもしれないと思います。より多くのデータベース作業 - より少ない開発者のストレス!

あなたにとって最も意味のあることは何ですか?データの簡単なテーブルを引き出す良い方法はありますか? それとも、私の汚い方法がおそらく最良のアイデアなのでしょうか?

私は Django 1.3 を使っています。より良い方法として GROUP_BY をうまく使えるようになったかどうかはわかりません。

どのように解決するのですか?

Django 1.10 以上

Django ドキュメントリスト extra として まもなく廃止 . (ご指摘ありがとうございます @seddonym、@Lucas03)。私が開いたのは チケット を開き、これがjarshwahが提供した解決策です。

from django.db.models.functions import TruncMonth
from django.db.models import Count

Sales.objects
    .annotate(month=TruncMonth('created'))  # Truncate to month and add to select list
    .values('month')                          # Group By month
    .annotate(c=Count('id'))                  # Select the count of the grouping
    .values('month', 'c')                     # (might be redundant, haven't tested) select month and count 

古いバージョン

from django.db import connection
from django.db.models import Sum, Count

truncate_date = connection.ops.date_trunc_sql('month', 'created')
qs = Order.objects.extra({'month':truncate_date})
report = qs.values('month').annotate(Sum('total'), Count('pk')).order_by('month')

編集

  • カウントを追加
  • django >= 1.10 の情報を追加しました。