2012-04-14 38 views
21

Tôi đang cố gắng nhóm các sản phẩm trước DAY, tuy nhiên date_created là trường datetime.Django ORM, nhóm theo ngày

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

lợi nhuận:

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

Tôi muốn:

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

chỉnh sửa: cơ sở dữ liệu backend MYSQL

+0

ngày như trong mon/tue/wed ? –

+0

vâng tôi muốn một cái gì đó như [{'hôm nay': 17}, {'ngày hôm qua': 21}, vv] –

Trả lời

25

Lấy cảm hứng từ this question thử này cho mysql

Product.objects.extra(select={'day': 'date(date_created)'}).values('day') \ 
       .annotate(available=Count('date_created')) 
+1

Điều này là hữu ích nhưng tôi đã phải xóa thứ tự mặc định với một order_by() ở giữa các giá trị() và chú thích(). Xem https://docs.djangoproject.com/en/dev/topics/db/aggregation/interinter-with-default-ordering-or-order-by. Cảm ơn! – somecallitblues

-1

Trong Django 1.4, bạn có thể sử dụng .dates('date_created', 'day') thay vì .values().

Hãy thử đoạn mã này:

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

này nên trở lại:

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

âm thanh gần nhưng tôi nhận được một danh sách chỉ có ngày: [datetime.datetime (2012, 4, 10, 0 , 0), datetime.datetime (2012, 4, 10, 0, 0), datetime.datetime (2012, 4, 10, 0, 0), datetime.datetime (2012, 4, 10, 0, 0)] –

+0

Hãy thử .annotate() trước khi tạo DateQuerySet bằng cách sử dụng .dates. – cfedermann

+0

Tôi đã thử rằng, không có sự khác biệt –

Các vấn đề liên quan