как сгруппировать записи по часам и вернуть экземпляры - PullRequest
0 голосов
/ 06 октября 2019

это моя модель, и я использую postgresql:

class TripRequest(models.Model):
    passenger = models.ForeignKey('user.Passenger', on_delete=models.DO_NOTHING)
    beginning_point = models.PointField()
    destination_point = models.PointField()
    trip_beginning_time = models.DateTimeField()
    ...

Я не очень хорошо знаком с предварительными запросами orm, я хочу сгруппировать запросы на поездки, которые имеют ближайшее (например, в определенный час) началовремя и после этого фильтра, кроме того, как ближайшая начальная точка или ближайший драйвер.

теперь есть ответы на SO, которые группируют запрос и возвращают счетчик или другую информацию для всех элементов группы, но я хочу просто сгруппироватьэкземпляров по часам и есть коллекция экземпляров для дальнейшей фильтрации, как я могу это сделать?

1 Ответ

1 голос
/ 06 октября 2019

Вы можете использовать функцию базы данных django Trunc :

from django.db.models.functions import Trunc

def get_dt_stats(model):
    current_date = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
    proxy = model.objects.filter(trip_beginning_time__gte=current_date) # Or any filter you need
    proxy = proxy.values(x=Trunc('trip_beginning_time', 'hour', tzinfo=tzlocal.get_localzone()))
    proxy = proxy.annotate(amount=Count('id'))
    return {k['x'].strftime('%Y-%m-%d %H:00'): k['amount'] for k in list(proxy)}

Эта функция возвращает dict с количеством объектов модели, сгруппированных по часам trip_beginning_time

...