Django组合2个具有相同值的字典/查询集

2024-05-17 15:31:24 发布

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

我有以下两个模型查询集,我想结合具有相同的价值,请您对此有您的建议??,任何帮助都将不胜感激。 我已经试过了,但和我想要的不一样

  1. 后=列表(链(q1,q2))
  2. 之后=q1 | q2

我的模型

class BuildingCell(models.Model): 
    ...

class InputCutSew(models.Model): 

    cell = models.ForeignKey(BuildingCell, blank=True, null=True, on_delete=models.SET_NULL) 

class Absent(models.Model): 

    cell = models.ForeignKey(BuildingCell, blank=True, null=True, on_delete=models.SET_NULL) 

#this is my queryset
    q1= InputCutSew.objects.filter(publish='2019-07-22', days='normal', user=factory_user_cutting).exclude(cell_name__isnull=True).exclude(
         cell_name__exact='').order_by('cell').values('cell', 'model').annotate(
         total_output_jam=Sum(Case(When(dummy_days='normal', then='output'))),
         total_output_ot=Sum(Case(When(dummy_days='overtime', then='output'))),
         total_time=Sum('time'),
         total_time_ot=Sum('time_ot'),
         total_time_ot1=Sum('time_ot1'),
         total_time_ot2=Sum('time_ot2'),
         total_time_ot3=Sum('time_ot3'))
    q2 = Absent.objects.filter(publish='2019-07-22', building_name='f2', bagian='CUT').values('cell', 'normal_mp', 'ot0_mp', 'ot1_mp', 'ot2_mp', 'ot3_mp').exclude(cell__occult_cell='yes')

#dictionary from my query set
q1 = [
    {'cell': 633, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 634, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 635, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 636, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 637, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 638, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 639, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 640, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 641, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 642, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 644, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None},
    {'cell': 645, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None}
]

q2 = [
    {'cell': 633, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 634, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 635, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 636, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 637, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 638, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 639, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 640, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 641, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 642, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 644, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 645, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None}
]

the result what i want
after = [
    {'cell': 633, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 634, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 635, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 636, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 637, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 638, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 639, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 640, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 641, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 642, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 644, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None},
    {'cell': 645, 'model': 'superstar', 'total_output_jam': 240, 'total_output_ot': 90, 'total_time': Decimal('7.920'), 'total_time_ot': Decimal('0.990'), 'total_time_ot1': Decimal('0.990'), 'total_time_ot2': Decimal('0.990'), 'total_time_ot3': None, 'normal_mp': Decimal('30.000'), 'ot0_mp': Decimal('30.000'), 'ot1_mp': Decimal('30.000'), 'ot2_mp': Decimal('30.000'), 'ot3_mp': None}
]

已解决更新的问题

我通过注释BuildingCell查询集得到想要的结果

q3 =  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__cell', 'absent__normal_mp', 'absent__ot0_mp', 'absent__ot1_mp', 'absent__ot2_mp', 'absent__ot3_mp').exclude(occult_cell='yes').annotate(
         total_output_jam=Sum(Case(When(inputcutsew__dummy_days='normal', then='inputcutsew__output'))),
         total_output_ot=Sum(Case(When(inputcutsew__dummy_days='overtime', then='inputcutsew__output'))),
         total_time=Sum('inputcutsew__time'),
         total_time_ot=Sum('inputcutsew__time_ot'),
         total_time_ot1=Sum('inputcutsew__time_ot1'),
         total_time_ot2=Sum('inputcutsew__time_ot2'),
         total_time_ot3=Sum('inputcutsew__time_ot3'))

Tags: noneoutputmodeltimecellmpottotal
2条回答

这样试试

list1 = [{'id': "1", "name": "xoxo"}, {'id': "2", "name": "yoyo"}]
list2 = [{'id': "1", "age": "11"}, {'id': "2", "age": "12"}]

list3 = []

for index,value in enumerate(list1):
    z = list1[index].copy()
    z.update(list2[index])
    list3.append(z)

print(list3)

输出

[{'id': '1', 'name': 'xoxo', 'age': '11'}, {'id': '2', 'name': 'yoyo', 'age': '12'}]

使用SQL的UNION运算符组合两个或多个查询集的结果。你知道吗

试试这个

q1 = Model1.objects.all()

q2 = Model2.objects.all()

q3 = q1.union(q2)

参考this

希望有帮助

相关问题 更多 >