diff options
| author | Keryn Knight <keryn@kerynknight.com> | 2026-01-10 09:07:18 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2026-03-11 18:05:44 +0100 |
| commit | b7c9c88111ddd4cc033355780398e2a24e156e38 (patch) | |
| tree | 0fce4e064c53f93e9fb185adfee3726a53dab8df /django/contrib | |
| parent | 804607df0e174c524a3ea880b8ecbb555ecb4abb (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.py | 23 |
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), |
