From d30febb4e59b659e0d279c77f61f936c199a05b2 Mon Sep 17 00:00:00 2001 From: Yoong Kang Lim Date: Sun, 5 Jun 2016 22:15:00 +1000 Subject: Fixed #26706 -- Made RelatedManager modification methods clear prefetch_related() cache. --- tests/many_to_many/tests.py | 34 ++++++++++++++++++++++++++++++++++ tests/many_to_one/models.py | 2 +- tests/many_to_one/tests.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/many_to_many/tests.py b/tests/many_to_many/tests.py index 86ffe816eb..2d35266f46 100644 --- a/tests/many_to_many/tests.py +++ b/tests/many_to_many/tests.py @@ -518,6 +518,40 @@ class ManyToManyTests(TestCase): self.assertQuerysetEqual(self.a4.publications.all(), []) self.assertQuerysetEqual(self.p2.article_set.all(), ['']) + def test_clear_after_prefetch(self): + a4 = Article.objects.prefetch_related('publications').get(id=self.a4.id) + self.assertQuerysetEqual(a4.publications.all(), ['']) + a4.publications.clear() + self.assertQuerysetEqual(a4.publications.all(), []) + + def test_remove_after_prefetch(self): + a4 = Article.objects.prefetch_related('publications').get(id=self.a4.id) + self.assertQuerysetEqual(a4.publications.all(), ['']) + a4.publications.remove(self.p2) + self.assertQuerysetEqual(a4.publications.all(), []) + + def test_add_after_prefetch(self): + a4 = Article.objects.prefetch_related('publications').get(id=self.a4.id) + self.assertEqual(a4.publications.count(), 1) + a4.publications.add(self.p1) + self.assertEqual(a4.publications.count(), 2) + + def test_set_after_prefetch(self): + a4 = Article.objects.prefetch_related('publications').get(id=self.a4.id) + self.assertEqual(a4.publications.count(), 1) + a4.publications.set([self.p2, self.p1]) + self.assertEqual(a4.publications.count(), 2) + a4.publications.set([self.p1]) + self.assertEqual(a4.publications.count(), 1) + + def test_add_then_remove_after_prefetch(self): + a4 = Article.objects.prefetch_related('publications').get(id=self.a4.id) + self.assertEqual(a4.publications.count(), 1) + a4.publications.add(self.p1) + self.assertEqual(a4.publications.count(), 2) + a4.publications.remove(self.p1) + self.assertQuerysetEqual(a4.publications.all(), ['']) + def test_inherited_models_selects(self): """ #24156 - Objects from child models where the parent's m2m field uses diff --git a/tests/many_to_one/models.py b/tests/many_to_one/models.py index 05491e99f1..abc9c7d826 100644 --- a/tests/many_to_one/models.py +++ b/tests/many_to_one/models.py @@ -43,7 +43,7 @@ class City(models.Model): @python_2_unicode_compatible class District(models.Model): - city = models.ForeignKey(City, models.CASCADE) + city = models.ForeignKey(City, models.CASCADE, related_name='districts', null=True) name = models.CharField(max_length=50) def __str__(self): diff --git a/tests/many_to_one/tests.py b/tests/many_to_one/tests.py index 20f2e0d56d..0de6973bb8 100644 --- a/tests/many_to_one/tests.py +++ b/tests/many_to_one/tests.py @@ -624,3 +624,48 @@ class ManyToOneTests(TestCase): # doesn't exist should be an instance of a subclass of `AttributeError` # refs #21563 self.assertFalse(hasattr(Article(), 'reporter')) + + def test_clear_after_prefetch(self): + c = City.objects.create(name='Musical City') + District.objects.create(name='Ladida', city=c) + city = City.objects.prefetch_related('districts').get(id=c.id) + self.assertQuerysetEqual(city.districts.all(), ['']) + city.districts.clear() + self.assertQuerysetEqual(city.districts.all(), []) + + def test_remove_after_prefetch(self): + c = City.objects.create(name='Musical City') + d = District.objects.create(name='Ladida', city=c) + city = City.objects.prefetch_related('districts').get(id=c.id) + self.assertQuerysetEqual(city.districts.all(), ['']) + city.districts.remove(d) + self.assertQuerysetEqual(city.districts.all(), []) + + def test_add_after_prefetch(self): + c = City.objects.create(name='Musical City') + District.objects.create(name='Ladida', city=c) + d2 = District.objects.create(name='Ladidu') + city = City.objects.prefetch_related('districts').get(id=c.id) + self.assertEqual(city.districts.count(), 1) + city.districts.add(d2) + self.assertEqual(city.districts.count(), 2) + + def test_set_after_prefetch(self): + c = City.objects.create(name='Musical City') + District.objects.create(name='Ladida', city=c) + d2 = District.objects.create(name='Ladidu') + city = City.objects.prefetch_related('districts').get(id=c.id) + self.assertEqual(city.districts.count(), 1) + city.districts.set([d2]) + self.assertQuerysetEqual(city.districts.all(), ['']) + + def test_add_then_remove_after_prefetch(self): + c = City.objects.create(name='Musical City') + District.objects.create(name='Ladida', city=c) + d2 = District.objects.create(name='Ladidu') + city = City.objects.prefetch_related('districts').get(id=c.id) + self.assertEqual(city.districts.count(), 1) + city.districts.add(d2) + self.assertEqual(city.districts.count(), 2) + city.districts.remove(d2) + self.assertEqual(city.districts.count(), 1) -- cgit v1.3