#36135: Prefetching a reverse GenericRelation raises AttributeError
-------------------------------------+-------------------------------------
Reporter: john | Owner: Simon
| Charette
Type: Bug | Status: closed
Component: | Version: 5.1
contrib.contenttypes |
Severity: Normal | Resolution: fixed
Keywords: prefetch | Triage Stage: Ready for
| checkin
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Sarah Boyce <42296566+sarahboyce@…>):
* resolution: => fixed
* status: assigned => closed
Comment:
In [changeset:"198b30168d4e94af42e0dc7967bd3259b5c5790b" 198b301]:
{{{#!CommitTicketReference repository=""
revision="198b30168d4e94af42e0dc7967bd3259b5c5790b"
Fixed #36135 -- Fixed reverse GenericRelation prefetching.
The get_(local|foreign)_related_value methods of GenericRelation must be
reversed because it defines (from|to)_fields and associated related_fields
in the reversed order as it's effectively a reverse GenericForeignKey
itself.
The related value methods must also account for the fact that referenced
primary key values might be stored as a string on the model defining the
GenericForeignKey but as integer on the model defining the
GenericRelation.
This is achieved by calling the to_python method of the involved content
type
in get_foreign_related_value just like GenericRelatedObjectManager does.
Lastly reverse many-to-one manager's prefetch_related_querysets should use
set_cached_value instead of direct attribute assignment as direct
assignment
might are disallowed on ReverseManyToOneDescriptor descriptors. This is
likely
something that was missed in f5233dc (refs #32511) when the is_cached
guard
was added.
Thanks 1xinghuan for the report.
}}}
--
Ticket URL: <
https://code.djangoproject.com/ticket/36135#comment:7>