繁体   English   中英

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

[英]Django combine 2 Dictionary/Queryset that have same value

我有以下两个模型查询集,我想将它们组合起来,具有相同的价值,请问您对此有何建议??,任何帮助将不胜感激。 我已经尝试过这个,但与我想要的不一样

  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'))

试试这个方法

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 运算符来组合两个或多个 QuerySet 的结果。

尝试这个

q1 = Model1.objects.all()

q2 = Model2.objects.all()

q3 = q1.union(q2)

参考这个

希望能帮助到你

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM