def test_change_sub_name_bulk(self): with CaptureQueriesContext(connection) as queries: old = preupdate_dependent(SubChildReverseNotO.objects.all()) SubChildReverseNotO.objects.all().update(name='S') update_dependent(SubChildReverseNotO.objects.all(), old=old) unoptimized = len(queries.captured_queries) with CaptureQueriesContext(connection) as queries: old = preupdate_dependent(SubChildReverseO.objects.all()) SubChildReverseO.objects.all().update(name='S') update_dependent(SubChildReverseO.objects.all(), old=old) optimized = len(queries.captured_queries) # should turn all sub names into single S self.p1_not_o.refresh_from_db() self.p1_o.refresh_from_db() self.assertEqual( self.p1_not_o.children_comp, 'c1_0#S,S,S,S,S,S,S,S,S,S$c1_1$c1_2$c1_3$c1_4$c1_5$c1_6$c1_7$c1_8$c1_9' ) self.assertEqual( self.p1_o.children_comp, 'c1_0#S,S,S,S,S,S,S,S,S,S$c1_1$c1_2$c1_3$c1_4$c1_5$c1_6$c1_7$c1_8$c1_9' ) # should save 10 individual subqueries, but adds one --> 9 self.assertEqual(unoptimized - optimized, 9)
def test_move_bulk_subchildren(self): p1 = Parent.objects.create() p2 = Parent.objects.create() c1 = Child.objects.create(parent=p1) c2 = Child.objects.create(parent=p2) s11 = Subchild.objects.create(subparent=c1) s12 = Subchild.objects.create(subparent=c1) s21 = Subchild.objects.create(subparent=c2) s22 = Subchild.objects.create(subparent=c2) p1.refresh_from_db() p2.refresh_from_db() self.assertEqual(p1.subchildren_count, 2) self.assertEqual(p2.subchildren_count, 2) old_relations = preupdate_dependent(Subchild.objects.all()) Subchild.objects.all().update(subparent=c2) update_dependent(Subchild.objects.all(), old=old_relations) p1.refresh_from_db() p2.refresh_from_db() self.assertEqual(p1.subchildren_count, 0) self.assertEqual(p2.subchildren_count, 4) self.assertEqual(p1.subchildren_count_proxy, 0) self.assertEqual(p2.subchildren_count_proxy, 4)
def test_update_bulk_s1(self): old_relations = preupdate_dependent(DepSub1.objects.filter(b=self.bb2)) DepSub1.objects.filter(b=self.bb2).update(b=self.bb1) update_dependent(DepSub1.objects.filter(b=self.bb1), old=old_relations) self.ba1.refresh_from_db() self.ba2.refresh_from_db() self.bb1.refresh_from_db() self.bb2.refresh_from_db() self.assertEqual(self.ba1.final_proxy, 'f1f2f3f4f5') self.assertEqual(self.ba2.final_proxy, 'f6f7f8f9f0') self.assertEqual(self.bb1.final_proxy, 'f1f2f3f4f5f6f7f8f9f0') self.assertEqual(self.bb2.final_proxy, '')
def test_update(self): ComputeLocal.objects.all().update(name='other') update_dependent(ComputeLocal.objects.all(), update_fields=['name']) self.cl.refresh_from_db() self.bu.refresh_from_db() self.assertEqual(self.cl.c1, 'OTHER') self.assertEqual(self.cl.c2, 'c2OTHER') self.assertEqual(self.cl.c3, 'c3OTHER') self.assertEqual(self.cl.c4, 'c4c3OTHER') self.assertEqual(self.cl.c5, 'c5c2OTHERc4c3OTHERc6123') self.assertEqual(self.cl.c6, 'c6123') self.assertEqual(self.cl.c7, 'c7c8') self.assertEqual(self.cl.c8, 'c8') self.assertEqual(self.bu.same_as_fk_c5, 'c5c2OTHERc4c3OTHERc6123')
def test_update_bulk_final_name(self): # here old is not needed, since the QS is stable itself (only endpoint data changed), # thus all data changes correctly trigger updates DepSubFinal.objects.filter(sub2=self.s21).update(name='X') update_dependent(DepSubFinal.objects.filter(sub2=self.s21)) self.ba1.refresh_from_db() self.ba2.refresh_from_db() self.bb1.refresh_from_db() self.bb2.refresh_from_db() self.assertEqual(self.ba1.final_proxy, 'XXXXX') self.assertEqual(self.ba2.final_proxy, 'f6f7f8f9f0') self.assertEqual(self.bb1.final_proxy, 'XXXXX') self.assertEqual(self.bb2.final_proxy, 'f6f7f8f9f0')
def test_base_change(self): for i in range(10): MtPtrDerived.objects.create(basename='D{}'.format(i)) b = MtPtrBase.objects.get(pk=1) b.basename = 'changed' b.save(update_fields=['basename']) self.assertEqual(b.mtptrderived.comp, 'changed') # create plain Basee object new_b = MtPtrBase.objects.create(basename='hello') # mass action MtPtrBase.objects.all().update(basename='new value') update_dependent(MtPtrBase.objects.all(), update_fields=['basename']) self.assertEqual(list(MtPtrDerived.objects.all().values_list('basename', flat=True)), ['new value'] * 10)
def test_update_bulk_final_sub2(self): # this needs old handling - seems a good indicator for this is whether the QS changes itself # here: filter(sub2=self.s21) before vs. filter(sub2=self.s22) after the update old_relations = preupdate_dependent( DepSubFinal.objects.filter(sub2=self.s21)) DepSubFinal.objects.filter(sub2=self.s21).update(sub2=self.s22) update_dependent(DepSubFinal.objects.filter(sub2=self.s22), old=old_relations) self.ba1.refresh_from_db() self.ba2.refresh_from_db() self.bb1.refresh_from_db() self.bb2.refresh_from_db() self.assertEqual(self.ba1.final_proxy, '') self.assertEqual(self.ba2.final_proxy, 'f1f2f3f4f5f6f7f8f9f0') self.assertEqual(self.bb1.final_proxy, '') self.assertEqual(self.bb2.final_proxy, 'f1f2f3f4f5f6f7f8f9f0')
def test_move_bulk(self): p1 = Parent.objects.create() p2 = Parent.objects.create() for i in range(10): Child.objects.create(parent=p1) p1.refresh_from_db() p2.refresh_from_db() self.assertEqual(p1.children_count, 10) self.assertEqual(p2.children_count, 0) old_relations = preupdate_dependent(Child.objects.all()) Child.objects.all().update(parent=p2) update_dependent(Child.objects.all(), old=old_relations) p1.refresh_from_db() p2.refresh_from_db() self.assertEqual(p1.children_count, 0) self.assertEqual(p2.children_count, 10)
def test_manually_cf_update_bulk(self): # do cfs updates manually after bulk create of many records names = ['testa', 'testb', 'testc'] ComputeLocal.objects.bulk_create( [ComputeLocal(name=name, xy=666, c8='SENTINEL') for name in names]) # get pks to test against after update pks = [el.pk for el in ComputeLocal.objects.filter(c8='SENTINEL')] update_dependent( ComputeLocal.objects.filter(c8='SENTINEL'), update_fields=['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8']) for i, el in enumerate(ComputeLocal.objects.filter(pk__in=pks)): name = names[i].upper() self.assertEqual(el.c1, name) self.assertEqual(el.c2, 'c2{}'.format(name)) self.assertEqual(el.c3, 'c3{}'.format(name)) self.assertEqual(el.c4, 'c4c3{}'.format(name)) self.assertEqual(el.c5, 'c5c2{}c4c3{}c6666'.format(name, name)) self.assertEqual(el.c6, 'c6666') self.assertEqual(el.c7, 'c7c8') self.assertEqual(el.c8, 'c8')
def update_APRs(modeladmin, request, queryset): update_dependent(models.Balance.objects.filter(account__in=queryset))
def test_updatetime(self): print('update 10000 records of SelfRef:') timer(lambda: update_dependent(SelfRef.objects.all())) print('check 10000 records of SelfRef:') timer(lambda: update_dependent(SelfRef.objects.all()))