Django:计算特定月份的对象数

Django:计算特定月份的对象数,django,django-models,django-templates,django-views,django-aggregation,Django,Django Models,Django Templates,Django Views,Django Aggregation,我有这个模型: class Person(models.Model): city = models.CharField(max_length=20, blank=True) added_date = models.DateField(default=datetime.date.today) 我想创建一个模板/视图,其中有一个月表和当月添加的人数,即1月5人,2月10人,3月8人,等等。。我有一个类似的表格供每个城市的所有人使用: cities = Patient.objects.v

我有这个模型:

class Person(models.Model):
   city = models.CharField(max_length=20, blank=True)
   added_date = models.DateField(default=datetime.date.today)
我想创建一个模板/视图,其中有一个月表和当月添加的人数,即1月5人,2月10人,3月8人,等等。。我有一个类似的表格供每个城市的所有人使用:

cities = Patient.objects.values('city').annotate(city_count=Count('city')).order_by('-city_count')
我不知道在我的桌子上怎么做。我可以过滤一个特定的月份,然后计算所有月份。但是我需要每个月通过一个循环来运行它,这将是多个数据库点击。我不想那样做


有没有一种不用编写sql而只使用django的api就能做到这一点的方法?

事实上,大多数数据库都有这样一种完美的方法,可以通过在django AFAIK中没有模拟的GROUP BY查询来做到这一点,这会让我转而使用sql来实现这一点。我在谷歌上搜索了django sql,找到了Doug Hellman关于这个问题的帖子:。我将以此作为将月份计数输入Django的起点。

事实上,大多数DBs都有这样一种完美的方式,通过在Django AFAIK中没有模拟的GROUP BY查询来实现这一点,这将导致我转而使用SQL来实现这一点。我在谷歌上搜索了django sql,找到了Doug Hellman关于这个问题的帖子:。我会以此为起点,将您的月数输入Django。

这是一个非常古老的线程,但我想我会回答,以防其他人在这里寻找解决方案。 该解决方案适用于Django 1.10+,使用ExtractMonth函数,有关更多详细信息,请访问官方网站

首先,你必须在一个月内导入

from django.db.models.functions import ExtractMonth
然后使用Person模型,代码如下

personsMonthlyData = Person.objects.annotate(month=ExtractMonth('added_date')).values('month').annotate(count=Count('id')).order_by('month')
[{month: 1, count: 3}, {month: 2: count: 1}]
PersonMonthlyData将输出如下内容

personsMonthlyData = Person.objects.annotate(month=ExtractMonth('added_date')).values('month').annotate(count=Count('id')).order_by('month')
[{month: 1, count: 3}, {month: 2: count: 1}]
其中,月份表示月份编号,例如1月份为1,2月份为2,每个月的计数分配给计数项目


我希望这能有所帮助。

这是一个非常古老的思路,但我想我会回答,以防其他人在这里寻找解决方案。 该解决方案适用于Django 1.10+,使用ExtractMonth函数,有关更多详细信息,请访问官方网站

首先,你必须在一个月内导入

from django.db.models.functions import ExtractMonth
然后使用Person模型,代码如下

personsMonthlyData = Person.objects.annotate(month=ExtractMonth('added_date')).values('month').annotate(count=Count('id')).order_by('month')
[{month: 1, count: 3}, {month: 2: count: 1}]
PersonMonthlyData将输出如下内容

personsMonthlyData = Person.objects.annotate(month=ExtractMonth('added_date')).values('month').annotate(count=Count('id')).order_by('month')
[{month: 1, count: 3}, {month: 2: count: 1}]
其中,月份表示月份编号,例如1月份为1,2月份为2,每个月的计数分配给计数项目


我希望这会有所帮助。

您是否考虑过将它们全部拉出来,用Python进行处理?这只是一个DB命中率,但是一个很大的命中率我想我可以尝试一下,但是我想知道是否有更优雅的方法使用django来帮助我,或者如果没有,允许DB查询为我做这件事;这对我来说似乎更合适。您是否考虑过将它们全部拉出来,用Python进行处理?这只是一个DB命中率,但是一个很大的命中率我想我可以尝试一下,但是我想知道是否有更优雅的方法使用django来帮助我,或者如果没有,允许DB查询为我做这件事;这对我来说似乎更合适。