2012-04-14 18 views
21

Próbuję grupować produkty według DAY, jednak date_created to pole datetime.Django ORM, grupa według dnia

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

powraca:

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

chcę:

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

edit: bazie interfejsu MySQL

+0

dzień jak w MON/tue/wed ? –

+0

Tak, chcę coś takiego jak [{'dzisiaj': 17}, {'wczorajszy': 21}, itp.] –

Odpowiedz

25

Zainspirowany this question spróbować tego dla mysql

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

To było pomocne, ale musiałem wyczyścić domyślne porządkowanie z jawnym order_by() pomiędzy wartościami() i adnotate(). Zobacz https://docs.djangoproject.com/en/dev/topics/db/aggregation/#interaction-with-default-ordering-or-order-by. Dzięki! – somecallitblues

-1

W Django 1.4, można użyć .dates('date_created', 'day') zamiast .values().

Spróbuj ten fragment kodu:

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

Ten powinien zwrot:

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

brzmi blisko, ale dostaję listę z tylko datami: [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

Spróbuj .annotate() przed utworzeniem DateQuerySet za pomocą. Dat. – cfedermann

+0

Próbowałem to, bez różnicy –