Opened 6 years ago

Last modified 6 years ago

#32281 closed New feature

Prefetech Object - to_attr has ambiguous behavior when using a related lookup — at Initial Version

Reported by: Tal Perry Owned by: nobody
Component: Database layer (models, ORM) Version: 3.1
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Code Example

from django.db.models import Prefetch

p = Prefetch("a_set", to_attr="my_a")
assert p.prefetch_to == "my_a"

p = Prefetch("b__a_set", to_attr="my_a")
assert p.prefetch_to == "my_a", p.prefetch_to

That last assertion fails because p.prefetch_to == "bmy_a"

Description and use case
We have a models X, Y and Z
Z has a foreign key to Y and Y has a foreign key to Z
We'd like to fetch X with all of it's Z's using prefetch related and to be able to set the attribute to "z"

But as above, this doesn't seem to work.

The ​relevant Django code seems to ignore this use case (or discourage it?) and instead puts to "z" attribute on each "Y"

            self.prefetch_to = LOOKUP_SEP.join(lookup.split(LOOKUP_SEP)[:-1] + [to_attr])


I assume "fixing this" is a breaking change, but could we do an explicit parameter for prefetch_to ?At the moment we're setting it manually after creating the prefetch object

Change History (0)

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