#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.

Reply via email to