我很难找到一种聪明又可靠的方法,该方法如何在查询开始时提供的每个指定日期时间运行多个注释,并且由于是即时计算的,因此没有存储在数据库中。
我的数据
from datetime import datetime
business_dates = [
datetime(year=2016, month=1, day=5),
datetime(year=2016, month=1, day=6),
datetime(year=2016, month=1, day=7),
]
我的模型:
class Employee(models.Model):
name = models.CharField(max_length=100, default='Not specified')
created = models.DateTimeField(auto_now_add=True)
所需的输出
请记住,total_employee_count
应该显示截至所述日期的员工总数。提到的数据可能不如数据示例所示的那么顺畅。
[
{'date': datetime(year=2016, month=1, day=5), 'total_employee_count': 22},
{'date': datetime(year=2016, month=1, day=6), 'total_employee_count': 24},
{'date': datetime(year=2016, month=1, day=7), 'total_employee_count': 29},
]
我不想要的内容:
循环business_dates
,然后为每个日期运行一个单独的查询。如果有100个日期,我不想运行100个单独的查询。可以说,现在运行子查询还可以。
有什么想法吗?
答案 0 :(得分:1)
from django.db.models import Count, DateTimeField
from django.db.models.functions import Trunc
from django.contrib.auth.models import User
business_dates = [
datetime.datetime(year=2016, month=1, day=5),
datetime.datetime(year=2016, month=1, day=6),
datetime.datetime(year=2016, month=1, day=7),
]
ret = (
Employee.objects
.annotate(day=Trunc('created', 'day', output_field=DateTimeField()))
.filter(day__in=business_dates)
.values('day')
.annotate(count=Count('id'))
.values('day', 'count')
)
答案 1 :(得分:1)
这将解决您的问题:
from django.db.models import Count
...
Employee.objects.filter(
created__in=business_dates
).values(
'created'
).annotate(
employee_count=Count('pk')
)
我们在这里所做的是按日期分组(同时按所需列表过滤),然后计算每个日期的对象数量。