#24201: order_with_respect_to GenericForeignKey
----------------------------------------------+--------------------
     Reporter:  AlexHill                      |      Owner:  nobody
         Type:  New feature                   |     Status:  new
    Component:  Database layer (models, ORM)  |    Version:
     Severity:  Normal                        |   Keywords:
 Triage Stage:  Unreviewed                    |  Has patch:  0
Easy pickings:  0                             |      UI/UX:  0
----------------------------------------------+--------------------
 As of 1.8, order_with_respect_to nearly works with generic relations.

 First thing that's broken is the `get_RELATED_order` and
 `set_RELATED_order` methods. They are set in
 
[[https://github.com/django/django/blob/d450af8a2687ca2e90a8790eb567f9a25ebce85b/django/db/models/base.py#L320|ModelBase._prepare]].
 You don't know what model is going to be on the other end of the
 GenericForeignKey, so I think those can simply be omitted if
 `opts.order_with_respect_to.rel` is `None`. (Perhaps something can be done
 here in cases where a `GenericRelation` is defined.)

 Next, you run into trouble
 
[https://github.com/django/django/blob/d450af8a2687ca2e90a8790eb567f9a25ebce85b/django/db/models/base.py#L796
 when Django tries to save a new object's _order field], because there's no
 `attname` attribute on the `GenericForeignKey`. You run into the same
 problem in `_get_next_or_previous_in_order()`.

 This is easily solved if you're OK with sprinkling details of the
 GenericForeignKey implementation in Django core: you can just try
 `attname`, and if that fails, filter on GFK's `ct_field` and `pk_field`.
 But maybe a better idea would be to introduce a method on field-like
 things returning a dictionary of filter parameters matching a given
 object, or else a property returning a sequence of (filter name, attribute
 name) pairs from which the filter parameters can be constructed. In the
 latter case, regular fields would return `((self.name, self.attname),)`,
 and GFKs would return `((self.fk_field, self.fk_field), (self.ct_field,
 self.ct_field))`.

--
Ticket URL: <https://code.djangoproject.com/ticket/24201>
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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.e8b65dc5851103a37093e479b56e1ccc%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to