summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorTom Forbes <tom@tomforb.es>2018-08-07 23:08:23 +0100
committerTim Graham <timograham@gmail.com>2018-08-17 14:58:45 -0400
commitc02d473781dc2e8699db8edd37cc77f7d43993fc (patch)
treea3343a1ff735eb182abb12ae6aded04e24186b8a /django
parentbf17f5e88466e3f571065345f5b2fea0d8af89fe (diff)
Fixed #29612 -- Added GenericRelation prefetch_related() cache invalidation.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/contenttypes/fields.py9
1 files changed, 9 insertions, 0 deletions
diff --git a/django/contrib/contenttypes/fields.py b/django/contrib/contenttypes/fields.py
index e55766aa6f..ed98ecb48c 100644
--- a/django/contrib/contenttypes/fields.py
+++ b/django/contrib/contenttypes/fields.py
@@ -545,6 +545,12 @@ def create_generic_related_manager(superclass, rel):
db = self._db or router.db_for_read(self.model, instance=self.instance)
return queryset.using(db).filter(**self.core_filters)
+ def _remove_prefetched_objects(self):
+ try:
+ self.instance._prefetched_objects_cache.pop(self.prefetch_cache_name)
+ except (AttributeError, KeyError):
+ pass # nothing to clear from cache
+
def get_queryset(self):
try:
return self.instance._prefetched_objects_cache[self.prefetch_cache_name]
@@ -577,6 +583,7 @@ def create_generic_related_manager(superclass, rel):
)
def add(self, *objs, bulk=True):
+ self._remove_prefetched_objects()
db = router.db_for_write(self.model, instance=self.instance)
def check_and_update_obj(obj):
@@ -620,6 +627,7 @@ def create_generic_related_manager(superclass, rel):
clear.alters_data = True
def _clear(self, queryset, bulk):
+ self._remove_prefetched_objects()
db = router.db_for_write(self.model, instance=self.instance)
queryset = queryset.using(db)
if bulk:
@@ -656,6 +664,7 @@ def create_generic_related_manager(superclass, rel):
set.alters_data = True
def create(self, **kwargs):
+ self._remove_prefetched_objects()
kwargs[self.content_type_field_name] = self.content_type
kwargs[self.object_id_field_name] = self.pk_val
db = router.db_for_write(self.model, instance=self.instance)