#24266: Deprecate `Options.get_parent_list` in favor of a new `get_ancestors` 
one.
-------------------------------------+-------------------------------------
               Reporter:  charettes  |          Owner:  nobody
                   Type:             |         Status:  new
  Uncategorized                      |
              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          |
-------------------------------------+-------------------------------------
 The `get_parent_list()` method was introduced
 
[https://github.com/django/django/blame/a53541852d5601232899e54d66e623bc163c6dc2/django/db/models/options.py#L647-L656
 more than 6 years ago] and has been returning an unordered `set()` since
 then.

 From the method name suffix and the misleading `__doc__` I guess the
 returned data type was changed late in the process of merging
 
[https://github.com/django/django/commit/9c52d56f6f8a9cdafb231adf9f4110473099c9b5
 Malcom's queryset refactor] in order to deal with the multiple ORM's
 ancestors existence checks by reducing
 [https://wiki.python.org/moin/TimeComplexity time complexity].

 While working on fixing a field shadowing issue in multi-inheritance
 scenarios (#24249) it was discovered that
 [https://github.com/django/django/pull/4018#issuecomment-72201349
 `get_parent_list()` actually returns] an unordered `set()` which might
 causes non-deterministic behaviors. For example, another patch working on
 making sure unique checks take multi-inheritance into account (#15321)
 could result in different validation errors being raised from the same
 input based on the non-deterministic ordering of ancestors.

 Since the undocumented `get_parent_list()` method seems to be
 
[https://github.com/search?utf8=%E2%9C%93&q=get_parent_list+language%3Apython&type=Code&ref=searchresults
 used in the wild] I suggest we deprecate and replace it by a
 `get_ancestors()` one with the following properties:

 * A more significant name given it returns ancestors regardless of
 lineage.
 * A return value ordered by the `__mro__` of the model.
 * A return value with `in` operations with similar time complexity.

 One of the available data structure with the required return value
 properties is `django.utils.datastructures.OrderedSet` but I wonder if the
 whole time complexity argument is not moot given multi-inheritance
 scenarios involving many ancestors shouldn't be that common.

 In this case, given we don't mind about backward compatibility of such a
 private API, we could also fix `get_parent_list()` to actually return a
 list of unique ancestors ordered by `__mro__`.

--
Ticket URL: <https://code.djangoproject.com/ticket/24266>
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/052.465aee56357fcc42af536959a83a842a%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to