2

我有这个模型:

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 的情况下做到这一点?

4

2 回答 2

0

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

首先你必须导入 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')

peopleMonthlyData 将输出类似这样的内容

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

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

我希望这有帮助。

于 2020-01-28T07:58:14.887 回答
-1

事实上,大多数 DB 都有如此完美的方式来使用GROUP BYDjango AFAIK 中没有类似物的查询来执行此操作,这将导致我进入 SQL 来执行此操作。我在谷歌上搜索了“django sql”并找到了 Doug Hellman 关于这个确切问题的帖子:http ://blog.doughellmann.com/2007/12/using-raw-sql-in-django.html 。我会以此为起点,将您的月份计数纳入 Django。

于 2010-09-04T19:11:14.377 回答