diff options
| author | Tom Forbes <tom@tomforb.es> | 2018-08-07 23:08:23 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-08-17 14:58:45 -0400 |
| commit | c02d473781dc2e8699db8edd37cc77f7d43993fc (patch) | |
| tree | a3343a1ff735eb182abb12ae6aded04e24186b8a /django | |
| parent | bf17f5e88466e3f571065345f5b2fea0d8af89fe (diff) | |
Fixed #29612 -- Added GenericRelation prefetch_related() cache invalidation.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/contenttypes/fields.py | 9 |
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) |
