34 Stimmen

Django ORM, Gruppe für Tag

Ich versuche, Produkte nach DAY zu gruppieren, aber date_created ist ein datetime-Feld.

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

zurück:

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

Ich möchte:

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

bearbeiten: Datenbank-Backend MYSQL

44voto

San4ez Punkte 7851

Inspiriert durch diese Frage Versuchen Sie dies für MySQL

from django.db.models import Count

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

6voto

Zanon Punkte 25577

Ähnlicher Ansatz von San4ez Antwort, gibt aber Daten als "JJJJ-MM-TT" statt als "datetime.datetime(JJJJ, MM, TT)" zurück:

Product.objects.extra(select={'day': "TO_CHAR(date_created, 'YYYY-MM-DD')"})
               .values('day') \
               .order_by('day') \
               .annotate(available=Count('date_created'))

1voto

cfedermann Punkte 3220

In Django 1.4 konnten Sie mit .dates('date_created', 'day') anstelle von .values() .

Probieren Sie dieses Codeschnipsel aus:

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

Diese なければならない Rückkehr:

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

0voto

ronin Punkte 1

Sie können versuchen

Product.objects.extra(select={'day': "TO_CHAR(date_created, 'YYYY-MM-DD')"})\
                .values('day')\
                .order_by('day')\
                .annotate(bets=Count('date_created'))

0voto

Diego Vinícius Punkte 1964

Indem Sie der Antwort von San4ez und die Änderungen von Zanon

Für mich musste ich einen Workaround machen, um mit Postgres oder Sqlite zu arbeiten, da die Count()-Funktion das Datetime-Feld berücksichtigt, spielt es keine Rolle, wenn Sie eine "Tag"-Eingabe nur mit dem Datum erstellen werden, da das Datum_erstellt immer noch die Zeitinformationen enthält, so dass mehrere Datensätze mit Zeit nicht zusammengeführt und gezählt werden, nachdem ich viele Dinge ausprobiert habe, habe ich diesen Weg des Überspringens der Zeit erreicht

Django 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'))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X