Opened 4 months ago

Last modified 7 weeks ago

#28600 assigned New feature

Add prefetch related support to RawQuerySet

Reported by: Adnan Umer Owned by: Adnan Umer
Component: Database layer (models, ORM) Version: master
Severity: Normal Keywords:
Cc: Дилян Палаузов Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Adnan Umer)

When using custom raw SQL queries with Django ORM,

  • There is no support to prefetch related models to increase performance
  • Query results need to be cached manually

Change History (14)

comment:1 Changed 4 months ago by Adnan Umer

Owner: changed from nobody to Adnan Umer
Status: newassigned

comment:2 Changed 4 months ago by Tim Graham

Has patch: unset
Summary: Prefetch Related Support in RawQuerySetAdd prefetch related support to RawQuerySet
Triage Stage: UnreviewedAccepted

Tentatively accepting, although I haven't looked into the history to understand if there's a design reason why it's not implemented. A post on django-users suggests that using prefetch_related_objects() (which has since been documented as a public API) works.

I'm unchecking "Has patch" as I don't see a patch anywhere. If there's a patch somewhere, please provide a link.

comment:3 Changed 4 months ago by Adnan Umer

Has patch: set
Needs tests: set

Here is the link to PR that enabled this feature.

Last edited 4 months ago by Adnan Umer (previous) (diff)

comment:4 Changed 3 months ago by Дилян Палаузов

Would you mind implementing the same for bulk_create() #28692?

comment:5 Changed 3 months ago by Дилян Палаузов

Cc: Дилян Палаузов added

comment:6 in reply to:  4 Changed 3 months ago by Adnan Umer

Replying to Дилян Палаузов:

Would you mind implementing the same for bulk_create() #28692?

Once someone accept the ticket, I'll post commit solution of that. BTW you can temporarily avoid that situation this way

models = ModelA.objects.bulk_create([ModelA(...), ModelA(...), ModelA(...)])
from django.db.models import prefetch_related_objects
prefetch_related_objects(models, 'b')
for m in models:
        print(m.b.description)  # No more extra SELECT query here
Last edited 3 months ago by Adnan Umer (previous) (diff)

comment:7 Changed 2 months ago by Asif Saifuddin Auvi

Needs documentation: set
Patch needs improvement: set

comment:8 Changed 2 months ago by Adnan Umer

Description: modified (diff)
Needs tests: unset

comment:9 Changed 2 months ago by Simon Charette

Unless __bool__ and __len__ support is required for prefetch_related to work they should be added/tracked in another PR/ticket.

comment:10 in reply to:  9 Changed 2 months ago by Adnan Umer

Replying to Simon Charette:

Unless __bool__ and __len__ support is required for prefetch_related to work they should be added/tracked in another PR/ticket.

Got that. Moving that to separate PR.

comment:11 Changed 2 months ago by Adnan Umer

Description: modified (diff)

comment:12 Changed 2 months ago by Adnan Umer

Needs documentation: unset
Patch needs improvement: unset

comment:13 Changed 2 months ago by Adnan Umer

Owner: Adnan Umer deleted
Status: assignednew

comment:14 Changed 7 weeks ago by Adnan Umer

Owner: set to Adnan Umer
Status: newassigned
Note: See TracTickets for help on using tickets.
Back to Top