Skip to content

Commit 0fcd72b

Browse files
salty-ivyfelixxm
authored andcommitted
Fixed #34633 -- Made create() method of reverse many-to-one managers clear prefetch_related() cache.
1 parent 729266c commit 0fcd72b

File tree

3 files changed

+10
-0
lines changed

3 files changed

+10
-0
lines changed

django/db/models/fields/related_descriptors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,7 @@ async def aadd(self, *objs, bulk=True):
840840

841841
def create(self, **kwargs):
842842
self._check_fk_val()
843+
self._remove_prefetched_objects()
843844
kwargs[self.field.name] = self.instance
844845
db = router.db_for_write(self.model, instance=self.instance)
845846
return super(RelatedManager, self.db_manager(db)).create(**kwargs)

docs/ref/models/querysets.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,7 @@ database.
12591259

12601260
Also, if you call the database-altering methods
12611261
:meth:`~django.db.models.fields.related.RelatedManager.add`,
1262+
:meth:`~django.db.models.fields.related.RelatedManager.create`,
12621263
:meth:`~django.db.models.fields.related.RelatedManager.remove`,
12631264
:meth:`~django.db.models.fields.related.RelatedManager.clear` or
12641265
:meth:`~django.db.models.fields.related.RelatedManager.set`, on

tests/many_to_one/tests.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,14 @@ def test_hasattr_related_object(self):
800800
# refs #21563
801801
self.assertFalse(hasattr(Article(), "reporter"))
802802

803+
def test_create_after_prefetch(self):
804+
c = City.objects.create(name="Musical City")
805+
d1 = District.objects.create(name="Ladida", city=c)
806+
city = City.objects.prefetch_related("districts").get(id=c.id)
807+
self.assertSequenceEqual(city.districts.all(), [d1])
808+
d2 = city.districts.create(name="Goa")
809+
self.assertSequenceEqual(city.districts.all(), [d1, d2])
810+
803811
def test_clear_after_prefetch(self):
804812
c = City.objects.create(name="Musical City")
805813
d = District.objects.create(name="Ladida", city=c)

0 commit comments

Comments
 (0)