#25590: Allow fields to set join class
-------------------------------------+-------------------------------------
Reporter: akaariai | Owner: nobody
Type: New | Status: new
feature |
Component: Database | Version: master
layer (models, ORM) |
Severity: Normal | Keywords:
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
If fields can set the class generating SQL for the join condition, that
would allow a way to inject complex raw SQL into ORM queries. The class
generating the join condition is currently hardcoded to
django.db.models.sql.datastructures.Join.
My use case is to do a join, where for each main object I need to fetch
the currently active, or the next active related object. Think of hotel
room reservations, where you want to have a list that shows the current
occupant of the room. But with a twist where if there is no current
occupant, then the next occupant of the room will be shown.
I can do this manually using PostgreSQL with the following query:
{{{
select *
from room left join lateral (
select *
from room_reservation
where room.room_id = room_reservation.room_id and
from_date = (
select min(from_date)
from room_reservation inner_rr
where inner_rr.room_id = room_reservation.room_id
and (inner_rr.to_date > now() or inner_rr.to_date
is null)
)
) as current_or_next_room_reservation on true;
}}}
Now, 1) I need a complex query inside the join, and 2) I need a lateral
join. Both of these are currently out of reach for Django.
If the join field could return a different class to be used instead of the
Django's currently hard coded Join class, then 3rd party field
implementations could generate exactly the SQL I want.
I believe the changes needed for custom join classes to be actually fairly
minor. I don't believe we want to make this public API, so we'd add just a
couple of minor changes to internals.
--
Ticket URL: <https://code.djangoproject.com/ticket/25590>
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 post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/051.d914ce60848efc58a8e8e4748acb557b%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.