我认为您可以使用Coalesce(*expressions, **extra) 函数来解决您的问题。
接受至少两个字段名称或表达式的列表并返回第一个非空值(注意空字符串不被视为空值)。
所以您的查询将如下所示:
from django.db.models import Sum, Value
from django.db.models.functions import Coalesce
emp3_list = \
Projectsummaryplannedhours.objects.\
filter(
Q(businessunit='a') &
Q(billinggroup__startswith='PLS - Project') &
(Q(displayval=sunday2) | Q(displayval=sunday))
).\
annotate(plannedhours__sum=Coalesce(
Sum('plannedhours'), Value(0)
)
).\
values_list('displayval', 'employeename')
更多信息请参见https://docs.djangoproject.com/en/1.9/ref/models/database-functions/#coalesce。
如果不存在要求和的条目,这将帮助您获得plannedhours__sum = 0。如果您还想在plannedhours__sum = 0 所在的每个条目中添加其他参数,您可以使用 Django 条件表达式。有关更多信息,请阅读 Case 表达式 (https://docs.djangoproject.com/en/1.11/ref/models/conditional-expressions/#case)。
Case() 接受任意数量的 When() 对象作为单独的参数。其他选项使用关键字参数提供。如果没有任何条件评估为 TRUE,则返回使用默认关键字参数给出的表达式。如果未提供默认参数,则使用 None。
from django.db.models import Sum, Value, IntegerField
from django.db.models.functions import Coalesce
emp3_list = \
Projectsummaryplannedhours.objects.\
filter(
Q(businessunit='a') &
Q(billinggroup__startswith='PLS - Project') &
(Q(displayval=sunday2) | Q(displayval=sunday))
).\
annotate(plannedhours__sum=Coalesce(
Sum('plannedhours'), Value(0)
),
x=Case(When(plannedhours__sum=0, then=Value(0)),
output_field=IntegerField())
).\
values_list('displayval', 'employeename')
如果计划小时数 = 0 而其他地方没有,这将为您提供额外的参数 x 等于 0。您还可以通过注释值过滤emp3_list。
因此,您可以将查询集传递给模板context = {'sunday': sunday, 'sunday2': sunday2, 'emp3': emp3_list},在那里对其进行迭代并获取您需要的属性:
for q in emp3_list:
print(q[0], q[1], q[2])
希望对你有所帮助。