Django - 迭代查询集并添加静态值

时间:2017-06-14 14:21:36

标签: python django

在以下查询集中,我按员工过滤每周计划的小时数(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)

1 个答案:

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

希望它会对你有所帮助。