Opened 21 months ago

Last modified 3 months ago

#29984 new New feature

Support prefetch_related() with Queryset.iterator()

Reported by: Taylor H Owned by: nobody
Component: Database layer (models, ORM) Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: yes
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description (last modified by Asif Saifuddin Auvi)

I was surprised when I found out that prefetch_related calls are ignored when using Queryset.iterator. I noticed in the docs here https://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator that it is because the "these two optimizations do not make sense together." That may have been true in the past, but it is definitely not the case now. The iterator allows chunking (by default 2000) and it would be very helpful to prefetch related for each chunk.

Change History (5)

comment:1 Changed 21 months ago by Tim Graham

Summary: Support prefetch_related with Queryset.iteratorSupport prefetch_related() with Queryset.iterator()
Triage Stage: UnreviewedAccepted

The situation isn't completely straightforward. There's a discussion on django-developers. Accepting the ticket to do something.

comment:2 Changed 21 months ago by Raphael Kimmig

I've created a proof of concept implementation https://github.com/django/django/pull/10707/

I think prefetching is probably closer to what a user would expect from the api.

comment:3 Changed 10 months ago by David Foster

Has patch: set
Needs documentation: set

comment:4 Changed 9 months ago by Asif Saifuddin Auvi

Description: modified (diff)
Version: 2.1master

comment:5 Changed 3 months ago by Simon Charette

Patch needs improvement: set

Patch needs both documentation and a deprecation warning when self._prefetch_related_lookups and chunk_size is None. The idea is to eventually turn this deprecation warning into an error and never performs prefetching unless a chunk size is specified.

Note: See TracTickets for help on using tickets.
Back to Top