summaryrefslogtreecommitdiff
path: root/tests/many_to_one
diff options
context:
space:
mode:
authorYoong Kang Lim <yoongkang.lim@gmail.com>2016-06-05 22:15:00 +1000
committerTim Graham <timograham@gmail.com>2016-08-05 13:32:27 -0400
commitd30febb4e59b659e0d279c77f61f936c199a05b2 (patch)
treec490770944097532ee322a8d21437b40a49eee0a /tests/many_to_one
parentea65c7cb4819cf18ac66215bc7b4df4af3fbe5ad (diff)
Fixed #26706 -- Made RelatedManager modification methods clear prefetch_related() cache.
Diffstat (limited to 'tests/many_to_one')
-rw-r--r--tests/many_to_one/models.py2
-rw-r--r--tests/many_to_one/tests.py45
2 files changed, 46 insertions, 1 deletions
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(), ['<District: Ladida>'])
+ 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(), ['<District: Ladida>'])
+ 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(), ['<District: Ladidu>'])
+
+ 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)