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