Django:计算特定月份的对象

时间:2010-09-04 16:53:51

标签: 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.values('city').annotate(city_count=Count('city')).order_by('-city_count')

我不知道如何为我的月份表做到这一点。我可以过滤特定月份,然后计算所有。但是我需要每个月通过一个循环运行它,这将是多个数据库命中。我不想那样做。

有没有办法在不编写SQL并只使用django的api的情况下执行此操作?

2 个答案:

答案 0 :(得分:0)

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

首先,您必须导入ExtractMonth,例如

from django.db.models.functions import ExtractMonth

然后使用您的Persons模型,代码将如下所示

personsMonthlyData = Person.objects.annotate(month=ExtractMonth('added_date')).values('month').annotate(count=Count('id')).order_by('month')

personsMonthlyData将输出如下内容

[{month: 1, count: 3}, {month: 2: count: 1}]

其中month表示月份号,例如1月1日和2月2日,并将每个月的计数分配给计数项目。

我希望这会有所帮助。

答案 1 :(得分:-1)

事实上,大多数数据库使用GROUP BY查询在Django AFAIK中没有模拟的这种完美方式,这将导致我进入SQL来执行此操作。我做了一个谷歌搜索“django sql”,并由Doug Hellman发表了关于这个确切问题的帖子:http://blog.doughellmann.com/2007/12/using-raw-sql-in-django.html。我会用它作为让你的月计入Django的起点。