在以下查询集中,我按员工过滤每周计划的小时数(displayval是我在此查询集中的一周)。我想为计划的小时数= 0添加一个项目,当员工没有计划一个星期我过滤的时候。
实现这一目标的最简单方法是什么?
def DesignHubR(request):
emp3_list = Projectsummaryplannedhours.objects.values_list('displayval', 'employeename')
.filter(businessunit='a')
.filter(billinggroup__startswith='PLS - Project')
.filter(Q(displayval=sunday2)|Q(displayval=sunday))
.annotate(plannedhours__sum=Sum('plannedhours'))
emp3 = map(lambda x: {'date': x[0], 'employee_name': x[1], 'planned_hours': x[2]}, emp3_list)
context = {'sunday': sunday, 'sunday2': sunday2, 'emp3': emp3}
return render(request,'department_hub_ple.html', context)
答案 0 :(得分:1)
我认为您可以使用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,则返回使用default keyword参数给出的表达式。如果未提供默认参数,则使用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])
希望它会对你有所帮助。