summaryrefslogtreecommitdiff
path: root/django/contrib
diff options
context:
space:
mode:
authorKeryn Knight <keryn@kerynknight.com>2026-01-10 09:07:18 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2026-03-11 18:05:44 +0100
commitb7c9c88111ddd4cc033355780398e2a24e156e38 (patch)
tree0fce4e064c53f93e9fb185adfee3726a53dab8df /django/contrib
parent804607df0e174c524a3ea880b8ecbb555ecb4abb (diff)
Refs #28455 -- Avoided QuerySet cloning for Prefetch() when queryset is not provided.
Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'django/contrib')
-rw-r--r--django/contrib/contenttypes/fields.py23
1 files changed, 16 insertions, 7 deletions
diff --git a/django/contrib/contenttypes/fields.py b/django/contrib/contenttypes/fields.py
index 0d7ef0f256..46a4e83f49 100644
--- a/django/contrib/contenttypes/fields.py
+++ b/django/contrib/contenttypes/fields.py
@@ -672,12 +672,17 @@ def create_generic_related_manager(superclass, rel):
return self._apply_rel_filters(queryset)
def get_prefetch_querysets(self, instances, querysets=None):
- if querysets and len(querysets) != 1:
- raise ValueError(
- "querysets argument of get_prefetch_querysets() should have a "
- "length of 1."
- )
- queryset = querysets[0] if querysets else super().get_queryset()
+ _cloning_disabled = False
+ if querysets:
+ if len(querysets) != 1:
+ raise ValueError(
+ "querysets argument of get_prefetch_querysets() should have a "
+ "length of 1."
+ )
+ queryset = querysets[0]
+ else:
+ _cloning_disabled = True
+ queryset = super().get_queryset()._disable_cloning()
queryset._add_hints(instance=instances[0])
queryset = queryset.using(queryset._db or self._db)
# Group instances by content types.
@@ -698,8 +703,12 @@ def create_generic_related_manager(superclass, rel):
# instances' PK in order to match up instances:
object_id_converter = instances[0]._meta.pk.to_python
content_type_id_field_name = "%s_id" % self.content_type_field_name
+ queryset = queryset.filter(query)
+ # Restore subsequent cloning operations.
+ if _cloning_disabled:
+ queryset._enable_cloning()
return (
- queryset.filter(query),
+ queryset,
lambda relobj: (
object_id_converter(getattr(relobj, self.object_id_field_name)),
getattr(relobj, content_type_id_field_name),