Django 2-如何针对多个非数据库字段值运行查询

时间:2019-05-10 13:50:14

标签: django django-orm

我很难找到一种聪明又可靠的方法,该方法如何在查询开始时提供的每个指定日期时间运行多个注释,并且由于是即时计算的,因此没有存储在数据库中。

我的数据

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个单独的查询。可以说,现在运行子查询还可以。

有什么想法吗?

2 个答案:

答案 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')
)

我们在这里所做的是按日期分组(同时按所需列表过滤),然后计算每个日期的对象数量。