Django多重注释和高级

2024-04-20 04:49:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的查询集,我想使用django注释进行多次求和,但我有一些错误,请您对此有什么建议??,任何帮助都将不胜感激。我已经试过了,但和我想要的不一样

queryset = (
    BuildingCell.objects
    .filter(
        absent__publish='2019-07-22',
        absent__building_name='f2',
        absent__bagian='CUT',
        inputcutsew__publish='2019-07-22',
        inputcutsew__days='normal',
        inputcutsew__user=factory_user_cutting
    )
    .exclude(inputcutsew__cell_name__isnull=True)
    .exclude(inputcutsew__cell_name__exact='')
    .order_by('inputcutsew__cell')
    .values(
        'inputcutsew__cell',
        'inputcutsew__model',
        'absent__normal_mp',
        'absent__ot0_mp',
        'absent__ot1_mp',
        'absent__ot2_mp',
        'absent__ot3_mp'
    )
    .exclude(occult_cell='yes')
    .annotate(
        total_output_jam=Coalesce(Sum(Case(When(inputcutsew__dummy_days='normal', then='inputcutsew__output'))), 0),
        total_output_ot=Coalesce(Sum(Case(When(inputcutsew__dummy_days='overtime', then='inputcutsew__output'))), 0),
        total_time=Coalesce(Sum('inputcutsew__time'), 0),
        total_time_ot=Coalesce(Sum('inputcutsew__time_ot'), 0),
        total_time_ot1=Coalesce(Sum('inputcutsew__time_ot1'), 0),
        total_time_ot2=Coalesce(Sum('inputcutsew__time_ot2'), 0),
        total_time_ot3=Coalesce(Sum('inputcutsew__time_ot3'), 0)
    )
    .annotate(
        normal_wmh=Coalesce(F('absent__normal_mp'), 0) * Coalesce(F('total_time'), 0),
        normal_swmh=Coalesce(F('absent__normal_mp'), 0) * Coalesce(F('total_time'), 0),
        overtime_wmh=(
                (Coalesce(F('absent__ot0_mp'), 0) * Coalesce(F('total_time_ot'), 0))
                + (Coalesce(F('absent__ot1_mp'), 0) * Coalesce(F('total_time_ot1'), 0))
                + (Coalesce(F('absent__ot2_mp'), 0) * Coalesce(F('total_time_ot2'), 0))
                + (Coalesce(F('absent__ot3_mp'), 0) * Coalesce(F('total_time_ot3'), 0))
        ),
        overtime_swmh=(
            (1.5*Coalesce(F('absent__ot0_mp'), 0) * Coalesce(F('total_time_ot'), 0))
            + (2 * Coalesce(F('absent__ot1_mp'), 0) * Coalesce(F('total_time_ot1'), 0))
            + (2 * Coalesce(F('absent__ot2_mp'), 0) * Coalesce(F('total_time_ot2'), 0))
            + (2 * Coalesce(F('absent__ot3_mp'), 0) * Coalesce(F('total_time_ot3'), 0))
        )
    )
    .annotate(
        sum_total_output_jam=Sum(F('total_output_jam')),
        sum_total_output_ot=Sum(F('total_output_ot')),
        sum_normal_wmh=Sum(F('normal_wmh')),
        sum_normal_swmh=Sum(F('normal_swmh')),
        sum_overtime_wmh=Sum(F('overtime_wmh')),
        sum_overtime_swmh=Sum(F('overtime_swmh'))
    )
)

FieldError at /superuser/inputtime/2/3/f2/CUT/2019-07-22 Cannot compute Sum('total_output_jam'): 'total_output_jam' is an aggregate


Tags: outputtimempottotalsumnormalabsent