我有这个型号:
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的情况下执行此操作?
答案 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的起点。