Fixed #34633 -- Made create() method of reverse many-to-one managers clear prefetch_related() cache.

This commit is contained in:
Aman Pandey 2023-11-27 23:21:33 +05:30 committed by Mariusz Felisiak
parent 729266c6f2
commit 0fcd72bc48
3 changed files with 10 additions and 0 deletions

View File

@ -840,6 +840,7 @@ def create_reverse_many_to_one_manager(superclass, rel):
def create(self, **kwargs):
self._check_fk_val()
self._remove_prefetched_objects()
kwargs[self.field.name] = self.instance
db = router.db_for_write(self.model, instance=self.instance)
return super(RelatedManager, self.db_manager(db)).create(**kwargs)

View File

@ -1259,6 +1259,7 @@ database.
Also, if you call the database-altering methods
:meth:`~django.db.models.fields.related.RelatedManager.add`,
:meth:`~django.db.models.fields.related.RelatedManager.create`,
:meth:`~django.db.models.fields.related.RelatedManager.remove`,
:meth:`~django.db.models.fields.related.RelatedManager.clear` or
:meth:`~django.db.models.fields.related.RelatedManager.set`, on

View File

@ -800,6 +800,14 @@ class ManyToOneTests(TestCase):
# refs #21563
self.assertFalse(hasattr(Article(), "reporter"))
def test_create_after_prefetch(self):
c = City.objects.create(name="Musical City")
d1 = District.objects.create(name="Ladida", city=c)
city = City.objects.prefetch_related("districts").get(id=c.id)
self.assertSequenceEqual(city.districts.all(), [d1])
d2 = city.districts.create(name="Goa")
self.assertSequenceEqual(city.districts.all(), [d1, d2])
def test_clear_after_prefetch(self):
c = City.objects.create(name="Musical City")
d = District.objects.create(name="Ladida", city=c)