Opened 19 months ago

Closed 19 months ago

Last modified 19 months ago

#20923 closed New feature (wontfix)

Unable to use fields from prefetch_related() in only() and defer()

Reported by: alexpirine Owned by: nobody
Component: Database layer (models, ORM) Version: 1.5
Severity: Normal Keywords: defer only ForeignKey reverse relationship
Cc: as@… Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

If I run the following query, I get the same error as seen in #14694:

ParentModel.objects.prefetch_related('child_model').only('parent_attribute', 'childs__child_atrtibute').all()

I guess it is not really a bug, as using only() and defer() in combination with prefetch_related() is not documented (documentation only mentions the use of select_related() with defer()).

But it could be a useful feature: is there a reason to support select_related() but not prefetch_related()?

I hope that an improvement of the patch for #14694 can enable this feature.

P.S. I wasn't able to fix it by myself, due to my lack of understanding of how django.db.models.sql.query.deferred_to_data() works. Simply removing and field.field.unique in django.db.models.sql.query.is_reverse_o2o() makes the error message disappear, but the instructions in only() remain ignored.

Change History (5)

comment:1 Changed 19 months ago by as@…

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

comment:2 Changed 19 months ago by alexpirine

  • Cc as@… added

I registered to follow this ticket.

comment:3 follow-up: Changed 19 months ago by akaariai

I think a better way is to add custom query support to prefetch_related (or, #17001). Main reason is that I believe implementation of communicating the only/defer data from the main query to the prefetch queries will be hard to do cleanly.

comment:4 Changed 19 months ago by akaariai

  • Resolution set to wontfix
  • Status changed from new to closed

Forgot to wontfix this...

comment:5 in reply to: ↑ 3 Changed 19 months ago by alexpirine

Replying to akaariai:

I think a better way is to add custom query support to prefetch_related (or, #17001). Main reason is that I believe implementation of communicating the only/defer data from the main query to the prefetch queries will be hard to do cleanly.

Thanks, it looks interesting. If I understood it correctly, I could pass the only() attribute to the custom queryset:

ParentModel.objects.prefetch_related(
  R('child_model', to_attr = 'childs', qs = ChildModel.objects.only('child_attribute')
).only('parent_attribute').all()

which would answer this issue.

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