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