33

商品を DAY でグループ化しようとしていますが、date_created は日時フィールドです。

Product.objects.values('date_created') \
               .annotate(available=Count('available_quantity'))

戻り値:

[
    {'date_created': datetime.datetime(2012, 4, 14, 13, 3, 6), 'available': 1},
    {'date_created': datetime.datetime(2012, 4, 14, 17, 12, 9), 'available': 1},
    ...
]

私が欲しい:

[
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ...
]

編集:データベース バックエンド MYSQL

4

5 に答える 5

43

この質問に触発されて、MySQL でこれを試してください

from django.db.models import Count

Product.objects.extra(select={'day': 'date( date_created )'}).values('day') \
               .annotate(available=Count('date_created'))
于 2012-04-14T14:38:37.007 に答える
1

Django 1.4 では、.dates('date_created', 'day')代わりに.values().

次のコード スニペットを試してください。

Product.objects.annotate(available=Count('available_quantity')) \
  .dates('date_created', 'day')

これ次のように返されます。

[
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ...
]
于 2012-04-14T14:05:41.303 に答える
0

San4ezの回答とZanonからの変更に従うことで

私にとっては、Postgres または Sqlite で動作するように回避策を講じる必要がありました。Count() 関数は datetime フィールドを考慮するため、日付だけで「日」入力を作成するかどうかは問題ではありません。時間情報を保持しているため、時間のある複数のレコードがマージされてカウントアップされることはありません。さまざまなことを試した後、時間をスキップする方法にたどり着きました

ジャンゴ 2.2

from django.db.models import Count

# Change date() to to_char(created_at, 'YYYY-MM-DD') if using Postgres
Product.objects.extra(select={'day': 'date( date_created )'})\
    .values('day') \
    .order_by('date_created__date')\
    .annotate(available=Count('date_created__date'))
于 2021-01-04T11:19:04.857 に答える