Как я могу получить количество объектов в день, используя Django? - PullRequest
2 голосов
/ 29 апреля 2010

У меня есть модель django с DateTimeField.

class Point(models.Model):
    somedata = models.CharField(max_length=256)
    time = models.DateTimeField()

Я хочу получить количество этих объектов за каждый день. Я могу сделать это с помощью следующего SQL-запроса, но не знаю, как это сделать через django.

SELECT DATE(`time`), Count(*)
FROM `app_point`
GROUP BY DATE(`time`)

Хорошо бы иметь возможность ограничить результаты диапазоном дат.

1 Ответ

3 голосов
/ 30 апреля 2010

Попробуйте это,

from django.db.models.sql.aggregates import Aggregate
from django.db.models import Count

class Day(Aggregate):
    """Custom aggregator
    """
    sql_function = 'DATE'
    sql_template = "%(function)s(%(field)s)"

    def __init__(self, lookup, **extra):
        self.lookup = lookup
        self.extra = extra

    def _default_alias(self):
        return '%s__%s' % (self.lookup, self.__class__.__name__.lower())
    default_alias = property(_default_alias)

    def add_to_query(self, query, alias, col, source, is_summary):
        super(Day, self).__init__(col, source, is_summary, **self.extra)
        query.aggregate_select[alias] = self

    q = Point.objects.annotate(day=Day('time')).annotate(found=Count('time')).values('day', 'found')
    # custom group by
    q.query.group_by = ["day"]

    print q
    # should return something like
    [{'found': 6, 'day': datetime.date(2010, 4, 30)}, 
     {'found': 4, 'day': datetime.date(2010, 5, 1)}, 
     {'found': 3, 'day': datetime.date(2010, 5, 2)}]

Согласно этому сообщению приведенный выше код, вероятно, будет работать только с базой данных MySql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...