Opened 6 years ago

Closed 6 years ago

Last modified 6 years ago

#32281 closed New feature (wontfix)

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

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 (last modified by Mariusz Felisiak)

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 == "b__my_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 (1)

comment:1 by Mariusz Felisiak, 6 years ago

Component: Uncategorized → Database layer (models, ORM)
Description: modified (diff)
Resolution: → wontfix
Status: new → closed
Type: Uncategorized → New feature

Thanks for this ticket, however IMO this is an expected behavior. In the second example a_set is a field lookup on b so we can change its name to my_a (in b) but we cannot assign it directly to the main object, it will be misleading.

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