#32281: Prefetech Object - to_attr has ambiguous behavior when using a related
lookup
-------------------------------------+-------------------------------------
Reporter: Tal Perry | Owner: nobody
Type: New feature | Status: closed
Component: Database layer | Version: 3.1
(models, ORM) |
Severity: Normal | Resolution: wontfix
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Mariusz Felisiak):
* status: new => closed
* resolution: => wontfix
* component: Uncategorized => Database layer (models, ORM)
* type: Uncategorized => New feature
Old 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 == "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
> [https://github.com/django/django/blob/bb64b99b78a579cb2f6178011a4cf9366e634438/django/db/models/query.py#L1570-L1587
> 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
New 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 == "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
[https://github.com/django/django/blob/bb64b99b78a579cb2f6178011a4cf9366e634438/django/db/models/query.py#L1570-L1587
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
--
Comment:
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/32281#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/066.3b3979c4b7ae5fe96a399933975489ae%40djangoproject.com.