【问题标题】:How do I get the number of objects per day using django?如何使用 django 获取每天的对象数量?
【发布时间】:2011-02-13 14:27:12
【问题描述】:

我有一个带有 DateTimeField 的 django 模型。

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`)

能够将结果限制在一个日期范围内也很好。

【问题讨论】:

  • 我看到了那个问题,但是他们正在一个字段上进行 GROUP BY。我需要对字段上的函数执行 GROUP BY,而不是字段本身。

标签: django


【解决方案1】:

试试这个,

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)}]

根据to this 的帖子,上面的代码可能只适用于 MySql 数据库。

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多