[Django] #36507: Document that only the base queryset’s prefetch_related() is preserved when using union()

12 views
Skip to first unread message

Django

unread,
Jul 14, 2025, 6:35:06 PM7/14/25
to django-...@googlegroups.com
#36507: Document that only the base queryset’s prefetch_related() is preserved when
using union()
-------------------------------------+-------------------------------------
Reporter: Clifford Gama | Type:
| Cleanup/optimization
Status: new | Component:
| Documentation
Version: 5.2 | Severity: Normal
Keywords: prefetch_related, | Triage Stage:
union | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
When using QuerySet.union() in Django, any prefetch_related() applied to
the second (and third, etc) queryset is silently ignored. See
[https://forum.djangoproject.com/t/using-union-with-querysets-that-have-a
-custom-prefetch-object/41638 forum thread in which it was suggested to
open a documentation ticket]. A docs improvement should also likely
include the workaround for using `Q` objects to do all prefetches in the
base qs (where possible), which is suggested by Simon in the forum.
--
Ticket URL: <https://code.djangoproject.com/ticket/36507>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Jul 14, 2025, 6:39:06 PM7/14/25
to django-...@googlegroups.com
#36507: Document that only the base queryset’s prefetch_related() is preserved when
using union()
-------------------------------------+-------------------------------------
Reporter: Clifford Gama | Owner: (none)
Type: | Status: new
Cleanup/optimization |
Component: Documentation | Version: 5.2
Severity: Normal | Resolution:
Keywords: prefetch_related, | Triage Stage:
union | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Clifford Gama:

Old description:

> When using QuerySet.union() in Django, any prefetch_related() applied to
> the second (and third, etc) queryset is silently ignored. See
> [https://forum.djangoproject.com/t/using-union-with-querysets-that-have-a
> -custom-prefetch-object/41638 forum thread in which it was suggested to
> open a documentation ticket]. A docs improvement should also likely
> include the workaround for using `Q` objects to do all prefetches in the
> base qs (where possible), which is suggested by Simon in the forum.

New description:

When using QuerySet.union() (possibly also `intersection()` and
`difference()`) in Django, any `prefetch_related()` applied to the second
(and third, etc) queryset is silently ignored. See
[https://forum.djangoproject.com/t/using-union-with-querysets-that-have-a
-custom-prefetch-object/41638 forum thread in which it was suggested to
open a documentation ticket]. A docs improvement should also likely
include the workaround for using `Q` objects to do all prefetches in the
base qs (where possible), which is suggested by Simon in the forum.

--
--
Ticket URL: <https://code.djangoproject.com/ticket/36507#comment:1>

Django

unread,
Jul 15, 2025, 9:55:56 AM7/15/25
to django-...@googlegroups.com
#36507: Document that only the base queryset’s prefetch_related() is preserved when
using union()
-------------------------------------+-------------------------------------
Reporter: Clifford Gama | Owner: (none)
Type: | Status: new
Cleanup/optimization |
Component: Documentation | Version: 5.2
Severity: Normal | Resolution:
Keywords: prefetch_related, | Triage Stage:
union | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Sniom):

* cc: Sniom (added)

--
Ticket URL: <https://code.djangoproject.com/ticket/36507#comment:2>

Django

unread,
Jul 16, 2025, 9:42:58 AM7/16/25
to django-...@googlegroups.com
#36507: Document that only the base queryset’s prefetch_related() is preserved when
using union()
-------------------------------------+-------------------------------------
Reporter: Clifford Gama | Owner: (none)
Type: | Status: new
Cleanup/optimization |
Component: Database layer | Version: 5.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: prefetch_related, | Triage Stage: Accepted
union |
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Natalia Bidart):

* component: Documentation => Database layer (models, ORM)
* stage: Unreviewed => Accepted

Comment:

Makes sense, thank you Clifford!
--
Ticket URL: <https://code.djangoproject.com/ticket/36507#comment:3>

Django

unread,
Jul 22, 2025, 7:34:01 AM7/22/25
to django-...@googlegroups.com
#36507: Document that only the base queryset’s prefetch_related() is preserved when
using union()
-------------------------------------+-------------------------------------
Reporter: Clifford Gama | Owner: Clifford
Type: | Gama
Cleanup/optimization | Status: assigned
Component: Database layer | Version: 5.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: prefetch_related, | Triage Stage: Accepted
union |
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Clifford Gama):

* owner: (none) => Clifford Gama
* status: new => assigned

--
Ticket URL: <https://code.djangoproject.com/ticket/36507#comment:4>

Django

unread,
Oct 8, 2025, 12:02:30 AM10/8/25
to django-...@googlegroups.com
#36507: Document that only the base queryset’s prefetch_related() is preserved when
using union()
-------------------------------------+-------------------------------------
Reporter: Clifford Gama | Owner: Chris M
Type: | Status: assigned
Cleanup/optimization |
Component: Database layer | Version: 5.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: prefetch_related, | Triage Stage: Accepted
union |
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Chris M):

* has_patch: 0 => 1
* owner: Clifford Gama => Chris M

Comment:

I have made an attempt at documenting this behavior in this
[https://github.com/django/django/pull/19929 PR].

I'm open to thoughts on how to improve this documentation: if it should
exist somewhere else or if any changes are needed. It is a pretty nuanced
topic, and I was trying to balance covering the details without making it
too confusing.

I included an example of using `Q` objects to filter within the first
`prefetch_related`. However, I'm not sure this is all that helpful of an
example to provide. It feels like it introduces a bit too much complexity
to the documentation.
--
Ticket URL: <https://code.djangoproject.com/ticket/36507#comment:5>
Reply all
Reply to author
Forward
0 new messages