示例#1
0
    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)