简体   繁体   中英

Django combine 2 Dictionary/Queryset that have same value

I Have the following two model queryset, and I want to combine that have same value, Could you please have your suggestions on this??, any help will be appreciated. i already try this but not same what i want

  1. after= list(chain(q1, q2))
  2. after= q1 | q2

my model

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}
]

updated problem solved

I get the result that I want by annotating a BuildingCell queryset

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

try this way ,

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)

output

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

Uses SQL's UNION operator to combine the results of two or more QuerySets.

try this

q1 = Model1.objects.all()

q2 = Model2.objects.all()

q3 = q1.union(q2)

refer this

hope it helps

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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